谈谈430中ADC10四种通道采样的问题,希望能对大家有所帮助
[复制链接]
起始对于ADC10四种通道采样的问题,如何操作ADC10,我想大家应该都知道,不知道的就去看手册吧。对于大多数人来说,就像我自己,最大的困难就是如何取值,ADC10中自带一个DTC可以不借助CPU而自动传值,但是传到RAM里的值如何读出来输入到引脚上,这个肯定会令初学者头疼一阵子,其实ADC10在将模拟量转化成数字量后会储存在ADC10MEM中,然后传值时由用户设定ADC10SA的首地址,我们只要将自定义的数组首地址赋值给ADC10SA就可以了,每次传值都是按你设定通道的先后来,如果是序列通道多次转换,加入你ADC10AE0=0X06,那么首先将P1^1通道的值传到数组上,然后会自动跳转到P1^2通道的值传给数组,然后再跳回P1^1通道,单通道就只有那一个通道来回跳转,以下我赋上了自己写好的序列通道多次转换的代码,带详细注解,如果有什么错误希望大家指出:
#include
unsigned int a[32];
unsigned int i,b=0;
float v=0;
void main(void) {
WDTCTL=WDTPW+WDTHOLD;
P1OUT=0;
ADC10CTL0|=ADC10ON+ADC10IE+REFON+REF2_5V+SREF_1+MSC+ADC10SHT_2;//取内部参考电压2.5V,使采样时间为16xADC10CLK,以增大采样时间以保证采样的准确性;
ADC10CTL1|=INCH_4+CONSEQ_3;//最大采样通道为P1^4,采用序列多次采样的模式
ADC10DTC1|=0X20;//每一个通道连续采样32次
ADC10AE0|=0X1a;//使能通道P1^4,3,1;
P1DIR=BIT0+BIT6;
while(1)
{
ADC10CTL0&=~ENC;//关闭采样使能
while(ADC10CTL1&ADC10BUSY);//判断是否有采样或转换动作
ADC10CTL0|=ADC10SC+ENC;//开始采样
ADC10SA=(unsigned int )a;//将组数a的首地址作为采样的起始地址,首先是对P1^1通道采样32次, 放入数组a中,一次循环后再对P1^3采样32次,以此类推,向下循环
__bis_SR_register(LPM0_bits+GIE);//关闭CPU,开启总中断
for(i=0;i<32;++i)
{
b+=a;
}
b=b/32;//取32次采样的平均
v=b*25;
v=(v/1023)/10;//转化为电压值
if(v>1.25)
P1OUT^=BIT0;
else
P1OUT^=BIT6;
}
}
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
LPM0_EXIT;
}
|