msp430 SD16A 多通道AD采集?
//看门狗定时器1秒 进入启动一次AD采集,,AD采集分二个通道0和6,当第6通道采集完后,再次进入低功耗模式3main()
{
while(1)
{
if(CH0_Finish)
{
CH0_Finish=0;
Tx_Pack(DATA);//取出第0通道数据发送
Choose_CH(6); //切换通道
}
if(CH6_Finish)
{
CH6_Finish=0;
Tx_Pack(DATA);//取第6通道数据
AD_RUN=0; //AD转换完成,进入低功耗模式
}
if(AD_RUN==0) LPM3; // 进入低功耗模式3,只有ACLK工作,最省电模式_BIS_SR(LPM3_bits + GIE);
}
}
/********************************************************************************/
void Choose_CH(uchar ch)
{
adc_ch_inf=ch; //记录当前通道号
SD16INCTL0 |=ch; //选择通道
SD16CTL |= SD16REFON; // 只打开1.2V参考源
Delay_us(500);
SD16CCTL0 |=(SD16SC + SD16IE); // 启动 SD16 进行转换并且允许 SD16 中断。
AD_RUN=1; // AD已启动标志置位
}
/******************************************************************************/
#pragma vector=SD16_VECTOR
__interrupt void SD16ISR(void)
{
SD16CCTL0 &= ~(SD16SC + SD16IE); // SD16 停止转换及禁止中断。
adc_last_val = SD16MEM0; // 保存 ADC 最后的结果.
if(adc_ch_inf==0)CH0_Finish=1;
else if(adc_ch_inf==6)CH6_Finish=1;
}
/*******************************************************************************
看门狗中断函数:watchdog_timer(); //1秒中断
******************************************************************************
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void)
{
Taken_time++;
if(Taken_time>=1)
{
Taken_time=0;
Choose_CH(0); //先由通道0开始转换
LPM3_EXIT; //退出低功耗模式,在AD完成后重新开启
}
}
有错吗??当通道采集时,不切换,没有问题,一切换就采集不到了,上来的数据全7FFF 很纳闷呀
我在上电时配置了这么个函数
void Config_SD16(void)
{
SD16CTL = SD16SSEL_1 + SD16DIV_1; // SLCK=MCLK=1M 2分频 f=500KHz,OSR=1024,参考电源暂不开启,转换前开,转换后关。节能!
SD16CCTL0 = SD16DF + SD16OSR_1024 + SD16SNGL; // + SD16UNI // 输出格式为2的补码(8000--7FFF)+过采样速率1024+单次转换 双极性模式(默认模式)
SD16INCTL0 = SD16INTDLY_0; // 中断延时(4第四次采样中断)
}
这函数,我想是不用老变的,就只在上电初始化了一次,,,在单通道实验时也没发现什么不对
在二个通道切换时就出了这问题,,,,每次在切换通道时,同时把这个也重新设置一下就可以了,纳闷哈,,,做一个通道时,我也没重新设置呀,,难道改变通道,会改变哪个寄存器吗?
页:
[1]