打印

free-modbus协议能否移植到CC430

[复制链接]
楼主: dengdc
手机看帖
扫描二维码
随时随地手机跟帖
21
午夜粪车| | 2018-3-31 19:41 | 只看该作者 回帖奖励 |倒序浏览

把误差放大了

使用特权

评论回复
22
dengdc|  楼主 | 2018-3-31 19:41 | 只看该作者

430的内置AD确实不咋地

使用特权

评论回复
23
spark周| | 2018-3-31 19:42 | 只看该作者

谁能帮我把ADC0838的C语言程序搞一搞

使用特权

评论回复
24
heweibig| | 2018-3-31 19:43 | 只看该作者

MSP430内部ADC的绝对精度相对较低,但5%也就太夸张了,还是老实点检查自己的程序和电路把。

使用特权

评论回复
25
spark周| | 2018-3-31 19:48 | 只看该作者
我用一个高精度的万用表测量了一下,电压为2496.5mV,应该是很准的了。那么一定是程序出了问题了吗?AD部份用到的函数就两个,一个是初始化,一个是AD转换,我把程序贴上来,请帮我分析一下哪里有问题,多谢多谢啊!!!!
void AD_Init(void)
{
  P6SEL |= BIT0+BIT1+BIT2;                  // Enable A/D channel A0 A1 A2
  ADC12CTL0 = ADC12ON+MSC+SHT0_6;           // Turn on ADC12, set
  ADC12CTL1 = SHP+CONSEQ_1+ADC12SSEL_2;     // Use sampling timer,
   
  ADC12MCTL0 = INCH_0+SREF_7;               // VeREF+=ref+, channel=A0  
  ADC12MCTL1 = INCH_1+SREF_7;               // VeREF+=ref+, channel=A1
  ADC12MCTL2 = INCH_2+SREF_7+EOS;           // VeREF+=ref+, channel=A2. end seq
}

void AD_start(void)
{
char i,time;

  ADC12CTL0 |= ENC;                         // Enable conversions
  ADC12CTL0 |= ADC12SC;                     // Start conversion

  for (i=0;i<20;i++)                               // 20次转换取平均
  {
    while (!(BIT2&ADC12IFG));               // wait untile AD conversion finished
    AD_results[0] = ADC12MEM0;              // Move results, IFG is cleared
    AD_results[1] = ADC12MEM1;              // Move results, IFG is cleared
    AD_results[2] = ADC12MEM2;              // Move results, IFG is cleared
        
    AD_AVG[0] = AD_AVG[0] + AD_results[0];
    AD_AVG[1] = AD_AVG[1] + AD_results[1];
    AD_AVG[2] = AD_AVG[2] + AD_results[2];   
   
    ADC12CTL0 |= ENC;                         // Enable conversions
    ADC12CTL0 |= ADC12SC;                     // Start conversion
  }
   
  ADC12CTL0 &= ~ENC;                                    // disable conversions
  for(i=0;i<3;i++)
    AD_AVG = (unsigned long)(AD_AVG/AD_COUNT); // AD平均值
}

使用特权

评论回复
26
wuhany| | 2018-3-31 19:49 | 只看该作者
将转换速率降低试试

430的AD精度一直都不怎么高,特别是速率较快的时候,和C8051F的内置AD根本不是一个档次
据说TI还是模拟芯片老大

使用特权

评论回复
27
lizye| | 2018-3-31 19:50 | 只看该作者


分辨率较高的内置ADC上电后一般都需要进行初始化和校准的,没有校准过的话,绝对精度没见过能高于10bit的……
可以参考一下厂家的demo。

使用特权

评论回复
28
jiahy| | 2018-3-31 19:51 | 只看该作者

先输入一固定电平,如果每次结果相差不大一般就可以了,绝对精度可以校准的

使用特权

评论回复
29
spark周| | 2018-3-31 19:52 | 只看该作者
问题已经解决了,其实是犯了个低级错误,程序void AD_start(void)的最后没有对AD结果清零,导致误差增大了,只要加上下面一条语句就OK了:
  for(i=0;i<3;i++)
    AD_AVG[i] = 0;

使用特权

评论回复
30
jlyuan| | 2018-3-31 19:53 | 只看该作者
考虑把单片机的数字地与采样信号的模拟地分开(用0欧电阻或磁珠),因为模拟地的电流会直接影响单片机的采样。

使用特权

评论回复
31
wyjie| | 2018-3-31 19:55 | 只看该作者

赞同。
用过449,它的内部ADC的精度、稳定性确实一般。

使用特权

评论回复
32
zhenykun| | 2018-3-31 20:18 | 只看该作者
各位高手再总结一下呗,有的芯片需要清零,有的不需要,有规律吗??

使用特权

评论回复
33
zhanghqi| | 2018-3-31 20:19 | 只看该作者
5%确实有点大,电压本身稳定吗?

使用特权

评论回复
34
jiajs| | 2018-3-31 20:21 | 只看该作者
我也出现过这种问题,是基准电压的原因,最好事先用万用表测下电压是多大,然后在程序中改一下

使用特权

评论回复
35
spark周| | 2018-3-31 20:22 | 只看该作者
唉,明天再看看吧

使用特权

评论回复
36
wangdezhi| | 2018-4-1 12:53 | 只看该作者
怎么不能移植?

使用特权

评论回复
37
isseed| | 2018-4-1 12:53 | 只看该作者
https://wenku.baidu.com/view/4407fa35be23482fb5da4c4b.html

使用特权

评论回复
38
xietingfeng| | 2018-4-1 12:54 | 只看该作者
freeModbus 的代码库还是很好用的

使用特权

评论回复
39
suzhanhua| | 2018-4-1 12:54 | 只看该作者
将MSP430的FreeModbus的官方Demo移植到IAR上

使用特权

评论回复
40
jkl21| | 2018-4-1 12:55 | 只看该作者
楼主移植成功了吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则