关于SD16 A折腾了好几天了,特来求助TI大神。之前我已经将SD16 A ”调通",但一些细节并没有去追究,先在面临如下一个问题:
我需要用MSP430FG479 的SD16 A测两个模拟电压,479只有channel 0通道(USER GUIDER说up to channel 6,不知哪款芯片有?),然后我选择了A2,A3两对模拟差分输入,通过定时开启每个差分输入(A2-A3)来检测两个模拟输入端(见代码A),但奇怪发现这种方法得到的结果不对,A2得到的结果和A3是一样的(A2应该比A3小一倍),A3的结果是正常的。于是我单独测试A2、A3,发现结果都对,然后我注意到了滤波器延时的问题,我选择了默认SD16INTDLY0=0,接着我分析了USER GUIDER,之前忽略滤波输出问题,经过梳状滤波器提高ADC精度(这个原理没怎么明白,大神有资料可以推荐下么?),我之前用的是默认的512过采样率,采集高16位,SD16LSBACC=0,我尝试改采样率,但结果一点都没变?(指导书里说当输出位数超过16位,需要读取两次SD16MEM0,这两个结果怎么合并得真实结果?)
//SD16 A初始化代码
void SD16A_ADC_init()
{
SD16CTL|=SD16REFON; //开启内部参考电压1.2V
SD16CTL|=SD16DIV_3; //MCLK 8分频
SD16CCTL0|=SD16SNGL; //单次转换
SD16AE|=SD16AE3+SD16AE2; //开启ADC2,ADC3模拟输入通道功能
SD16CCTL0|=SD16UNI+SD16OSR_512; //单极性输出0000-0xffffFF,先输出高16位(OSR=256,输出24位)
}
代码A: ADC采样函数
//输入参数SD_INCH:模拟差分通道
uint SD16A_Sample(uint SD_INCH)
{
SD16INCTL0|=SD_INCH; SD16CCTL0|=SD16SC;
while(!(SD16CCTL0&SD16IFG));//等待转换结束
return(SD16MEM0);
}
灰小子:
有本《MSP430系列单片机系统工程设计与实践》,里面对SD16讲解的比较详细,你可以参考下
liming pi:
回复 灰小子:
谢谢你的指教,详尽看了下,能解决我部分疑惑,但有两点书本也没有说清楚:
(1)关于过采样率OSR和SD16MEM0数据输出关系,书本例子:例如在OSR=256或者128,都是直接读取结果寄存器一次。这个结果就是真实的结果吗?不需要处理?
(2)关于模拟输入通道选择,只需要使用SD16INCHx来选择CH0-CH7。如第一帖中附录A程序,没有什么问题啊,但为什么在模拟通道轮流输入就会发生问题呢?