问题描述:
连接方式:
SD0P :A+,信号通过510欧姆电阻输入
SD0N:A-,与Vref相连
采用内部Vref,输入信号与单片机共地
软件代码如下:
void SD24_Init()
{
SD24BCTL0 = SD24SSEL_1|SD24DIV1; //选择SMCLK为SD24_B的时钟源
SD24BCTL0 |= SD24REFS; //提供内部基准,可不设置,默认外部输入 SD24BINCTL0 |= SD24INTDLY_1; //Interrupt on 3rd sample(采样延时选择)
SD24BIE |=SD24IE0; //使能通道0中断
__delay_cycles(0x3600); //Delay for 1.2V REF startup(内部基准建立时间)
SD24BCCTL0 |=SD24SC; //设置启动转换位
__bis_SR_register(LPM0_bits | GIE); //进入LPM0 w/ interrupts
}
long int SD24_Sample(unsigned int AverageNum)
{
long long int ADC_Sum = 0; //定义累加值
int i;
if(AverageNum == 0)
AverageNum =1; //至少要采样1次
SD24BIE |=SD24IE0; //打开ADC的中断
_EINT(); //开总中断
SD24BCCTL1 |= SD24SC; //设置启动转换位 for(i=0;i<=AverageNum;i++) //循环连续采样
{
while(ADC_Flag == 0) //等待一次采样结束
__bis_SR_register(LPM0_bits | GIE); //进入休眠,只有ADC中断(转换完毕),能将CPU唤醒.LMP0
ADC_Flag =0; //清除软件标志
ADC_Sum +=ADC_Result; //按有符号模式累加
}
SD24BCCTL1 &= ~SD24SC; //发送停止采样命令
SD24BIE &= ~SD24IE0; //关闭中断
return (ADC_Sum/AverageNum); //求平均值
}
/********************************************************
*名称: SD24_B_ISR()
*功能: 中断服务路径
*说明:SD24_B 中断(for LMP91000)
*入口参数:None
*出口参数:None*范例:None*********************************************************/#pragma vector=SD24B_VECTOR
__interrupt void SD24BISR(void)
{
switch(SD24BIV)
{ case SD24BIV_SD24OVIFG: //SD24MEM Overflow
break; case SD24BIV_SD24TRGIFG: //SD24 Trigger IFG break; case SD24BIV_SD24IFG0: //SD24MEM0 IFG
ADC_Result = SD24BMEMH0; //Save CH0 results(clear IFG)
ADC_Result = (ADC_Result<<16)|SD24BMEML0; //存储24位ADC值
ADC_Flag=1; //通知应用程序,中断已发生
break; case SD24BIV_SD24IFG1: //SD24MEM1 IFG break; } __low_power_mode_off_on_exit(); //退出中断后,唤醒CPU
}
问题:代码执行后(外部信号未加),A+端会有一个1.049V左右的电压,A-端实际测出是1.153V左右电压
连接传感器,传感器实际输出电压大概为0.3V左右,但不管是不是加上这个信号,A+端的电压都不会改变
请问:我这样的硬件连接方式是否存在问题?为什么A+端会一直有个电压?
转换结果:9434808 9436118 9435772等,但我不知道如何换算,求指教
xue song2:
补充:单片机型号:MSP430F6721,SD24_B
灰小子:
SD24是差分输入的,你不用计较A+端的电压。
实际上采样得到的是16位的有效数,你应该去掉24位中无效的位
xue song2:
回复 灰小子:
您是说ADC_Result =(ADC_Result<<16)|SD24BMEML0 ,这个计算方式是不对的么?
xue song2:
回复 灰小子:
感谢你的回复,今天已经找到问题所在了,不过还是不理解采样得到的是16位数据,我按24位有效位计算,精度很高。