因为单片机的处理能力有限,举例来说,一个AD从启动、转化、读取数据之间,总的时间很长,但是需要单片机照顾的时间并不多,可以把AD各个通道的启动、转化、读取数据3部分用状态转移的方法,把他分段设计;
进入ppm程序,单片机启动采样后,用定时器,设定一个延时,定时时间到,PPM程序的状态转换到读取AD数据状态,然后启动下个通道的采样依次循环读完所有通道……
uint ReadAdc(uchar ch)
{
ADMUX=ch; //Select channel
//Read null once as AVR datasheet says
ADCSRA=0xC6; //Start ADC
while(ADCSRA&(1<<ADSC)); //Wait adc ok
ADCSRA=0xC6; //Start ADC
while(ADCSRA&(1<<ADSC)); //Wait adc ok
return ADC;
}
大致这样:
//step=?(0启动AD,1读取AD转换结果,2再次启动,3再次读取)
if(TimeOK?) //程序入口为:定时器中断函数中的标记;载入
{
switch(step )
{
case 0:
//代码……//Start ADC;
设置所需的定时器延时,中间无需CPU干预;
step = 1; //切换程序工作步骤
break;
case 1:
//代码 //Wait adc ok;
设置所需的定时器延时,中间无需CPU干预;
step = 2; //切换程序工作步骤
break;
case 2: //代码;
设置所需的定时器延时,中间无需CPU干预;
step = 0; //切换程序工作步骤
break;
……
}
}
|