syuan163 发表于 2013-4-27 19:30:33

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

wjshmily 发表于 2013-4-28 10:41:51

你这里只用到了PA7作为采集啦,多通道?你还有哪个通道用到了?这里是么有看到的~

绿茶山人 发表于 2013-4-28 14:44:27

在AD中断服务函数中先把第一个通道数据采集n次(为了准确取n次平均)存入临时数组中,然后求平均值,存入转换结果数组中,然后切换到下一通道,以上数组下标也加1,然后重复下去,到最后一通道切换到第一通道。

syuan163 发表于 2013-4-29 19:05:08

wjshmily 发表于 2013-4-28 10:41 static/image/common/back.gif
你这里只用到了PA7作为采集啦,多通道?你还有哪个通道用到了?这里是么有看到的~ ...

我的意思是只用到一个通道,我要改成多通道的

wf8421 发表于 2013-5-21 02:09:45

你这问题解决了吗?我现在也遇到这个问题了,同求解决方法

makeflyeasy 发表于 2014-3-20 13:32:40

mega16多路AD转换怎么弄呢???

makeflyeasy 发表于 2014-3-24 19:13:21

我是不是应该转化一下思路了
页: [1]
查看完整版本: atmega16 多通道AD转换如何编写?