Other Parts Discussed in Thread:MSP430F5438
如题,我在主程序中赋值,会将值赋给ADC寄存器ADC12MEM0,这是什么原因造成的?
Susan Yang:
能否给出详细的代码?我们具体看一下,谢谢
,
user6177096:
这是ADC的配置:
void ad_ch(uchar ch)
{//_DINT(); P6SEL |= ch;ADC12CTL0 &= ~ADC12ENC;// 设置采样保持时间,最大时间周期以提高转换精度// 注意MSP430F5438没有REF模块,片内基准无效// 操作ADC12REF2_5V ,ADC12REFON并无意义ADC12CTL0 = ADC12SHT0_15 + ADC12SHT1_15 + ADC12ON ;ADC12MEM0=0;// 采样保持脉冲来自采样定时器// Nadc = 4095 × (Vin-VR -)/(VR +-VR -) ADC12CTL1 = ADC12SHP;// 关闭内部内部温度检测以降低功耗,注意或操作否则修改转换精度ADC12CTL2 |= ADC12TCOFF ; // 基准电压选择AVCC,并选择11通道——(AVCC-AVSS)/2//ADC12MCTL0 = ADC12SREF_2+ ADC12EOS+ch;ADC12MCTL0 = ADC12EOS+ch;// __delay_cycles(75);// ADC12使能ADC12CTL0 |= ADC12ENC;ADC12CTL0 |= ADC12SC; // 开始转换//while ((ADC12CTL1 & ADC12BUSY));while (!(ADC12IFG & BIT0));if(ch==1){p61=ADC12MEM0;p63=0;p76=0;}if(ch==3){p63=ADC12MEM0;p61=0;p76=0;}if(ch==13){p76=ADC12MEM0;p61=0;p63=0;}//_EINT();
}我目前用到的是P63,采集传感器的AD值。此AD值反馈给电机判断是否达到合适的流量值。
下面是主循环中1s中断中进行的操作:
我会将 font_pressure 的值发送到串口屏显示。发现,P63的AD值会根据我 font_pressure 的值变化而变化。实际电表测量电压值变化正常。
之后屏蔽了下段代码,我只是随便在main.h见了一个变量,在此处赋值,依旧会把这个值给P63,显示AD采样在正常值和有误值跳动。if(flag_1s==1){flag_1s=0;LWPI2cInit(); LWPS_Send_Command();LWPS_Data_Read();if(LWPS_VirStructure.Presure_Float < 0){LWPS_VirStructure.Presure_Float = -LWPS_VirStructure.Presure_Float;font_pressure = (uint)LWPS_VirStructure.Presure_Float;font_pressure_display();}else{font_pressure = 0;font_pressure_display();}
}
,
Susan Yang:
若是可以的话,请私信一下完整工程,我在开发板上实验一下,谢谢
私信方式: 将鼠标放在我的头像上悬停一会儿,就会出现私信的按键,而后点击并将工程压缩后以附件形式添加
,
Susan Yang:
您使用的是IAR? 我这边刚换了电脑,还没安装IAR以及配置license。
可能回复的时间会稍微长一些
,
user6177096:
对的,是IAR的。没关系,麻烦您啦!
,
Susan Yang:
好的,我会在安装测试后给您回复
,
Susan Yang:
我用开发板 MSP-EXP430F5438测试了一下,如下图,并没有赋值给ADC12MEM0
,
user6177096:
您可以打断点看一下第569行pwm_ad_run这个参数的变化,这个参数就是采集到的AD值,他会在几百到几千之间跳动。没有任何影响他的因素,取消赋值就不会有这个变化。
,
Susan Yang:
抱歉,我这边并没有像您工程内的多种外设外设,所以在测试PWM和ADC上无法完全按照您的代码。
我暂时无法运行到pwm_ad_run处
但是理论上这个赋值应该和pwm_ad_run没有关系,出现这种问题应该是赋值导致的内存分配问题,建议您对照一下有/无赋值时的map文件上的差别
,
user6177096:
只是换了以下定义的位置,现在就正常了。这个真是匪夷所思。
,
Susan Yang:
很高兴您能解决问题!
出现这种问题应该是赋值导致的内存分配问题,还是建议您对照一下map文件上的差别