atmega16 多通道AD转换如何编写?
以下是通过中断方式读取的电压值,但是只有一个通道的,我想读取多通道的AD值,请问如何修改,貌似通过中断方式的方法行不通,请大家给个思路哈!#include<iom16v.h>
#include <macros.h>
#include"1602.h"
#define uchar unsigned char
#define uint unsigned int
#define N 64
uchar adc_0[]={"ADC_0: . V"};
uchar k=0;
uint sum_adc={0};
//ADC测试,使用1602显示ADC0和ADC1的值
//主函数
void main(void)//主函数
{
unsigned int i,j;
unsigned char disbuf={0,0,0,0};
DDRA|=1<<0|1<<1|1<<2|0<<7;//设置PA0,PA1,PA2为输出,PA7为输入
PORTA=0x00;
DDRB|=0xFF;//数据口输出
PORTB=0xFF;
LcdInit(); //设置液晶显示器
WriteChar(1,0,13,adc_0);//显示
ADCSRA=0X00;
ADMUX =(1<<REFS0)|(1<<REFS1)|(0<<MUX0)|(0<<MUX1)|(0<<MUX2)|(0<<MUX3)|(0<<MUX4); //采用内部5参考电压,ADC7输入
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1) ;//ADC转换 64分频
SEI();//开中断
while(1);
} //ENDmain
uint ADC_Convert(void)
{
uint temp1,temp2;
temp1=(uint)ADCL;
temp2=(uint)ADCH;
temp2=(temp2<<8)+temp1;//10位精度
return(temp2);
}
#pragma interrupt_handler adc_isr:iv_ADC
void adc_isr(void)
{
unsignedlong int i;
unsigned char disbuf={0,0,0,0,0};
unsigned char f;
unsigned long sum_aver_adc=0;
ADMUX =(1<<REFS0)|(1<<REFS1)|(1<<MUX0)|(1<<MUX1)|(1<<MUX2)|(0<<MUX3)|(0<<MUX4);//内部2.56基准,PA7 AD输入
ADCSRA|=(1<<ADSC);//启动AD转换
sum_adc=ADC_Convert();
k++;
if(k>=N)
{
k=0;
for(f=0;f<N;f++)
{
sum_aver_adc=sum_aver_adc+sum_adc;//总的加起来
}
sum_aver_adc=(sum_aver_adc/N); //除下,算平均
i=(26000* sum_aver_adc)/1023; //算出电压
disbuf=i/10000;
i=i%10000;
disbuf=i/1000;
i=i%1000;
disbuf=i/100;
i=i%100;
disbuf=i/10;
i=i%10;
disbuf=i;
WriteNum(1,6,ASCII]);
WriteNum(1,8,ASCII]);
WriteNum(1,9,ASCII]);
WriteNum(1,10,ASCII]);
WriteNum(1,11,ASCII]);
}
}//end void
你这里只用到了PA7作为采集啦,多通道?你还有哪个通道用到了?这里是么有看到的~ 在AD中断服务函数中先把第一个通道数据采集n次(为了准确取n次平均)存入临时数组中,然后求平均值,存入转换结果数组中,然后切换到下一通道,以上数组下标也加1,然后重复下去,到最后一通道切换到第一通道。 wjshmily 发表于 2013-4-28 10:41 static/image/common/back.gif
你这里只用到了PA7作为采集啦,多通道?你还有哪个通道用到了?这里是么有看到的~ ...
我的意思是只用到一个通道,我要改成多通道的 你这问题解决了吗?我现在也遇到这个问题了,同求解决方法 mega16多路AD转换怎么弄呢??? 我是不是应该转化一下思路了
页:
[1]