qq1328454800 发表于 2012-7-11 20:35:43

atmega16内部AD多路采集

当我用atmega16内部AD一路采集信号时用到了AD的中断,我现在想是想三路测量,还要用到中断函数吗,新手上路,请大家多多指教???
#include <iom16v.h>
#include <macros.h>
#include "12864.h"
void adc_init(void)//ADC端口初始化
{
DDRA &= ~BIT(0);//设置AD0端口为输入(一定要设置成输入)
PORTA &= ~BIT(0);//PORTA |= BIT(0);(设置成1、0都可以,)
ADMUX = 0X40;//参考电压为AVCC,ADC结果为有对齐,单端输入为ADC0
ADCSRA = 0XEa;//ADCSRA=0XF8;ADC时钟分频为4分频
SFIOR = 0X00;//设置为连续自由转换
SREG |= BIT(7);//打开总中断
}

void adc_zh(uchar value_L,uchar value_H)
{
long int value;
int V;
value = value_H * 256;//十六进制转换成十进制
value = value + value_L;
V =(int)(value*5000/1024);//转换成电压显示
Lcd_DisplayOnenum(1,1,V);
}
void main()
{
lcdport_init();
lcd_init();
lcd_clr();
adc_init();
while(1);
}

#pragma interrupt_handler adc_isr:15
void adc_isr(void)//中断函数的服务程序
{
uchar adc_H,adc_L;
adc_L = ADCL;//读出低位
adc_H = ADCH;//读出高位
adc_zh(adc_L,adc_H);//将十六进制转换成十进制
}

yklstudent 发表于 2012-7-11 22:25:58

{:sleepy:}

holyfire 发表于 2012-7-19 21:43:03

其实只有一个内核不能同时采集多路

zhanyanqiang 发表于 2012-7-20 10:12:49

本帖最后由 zhanyanqiang 于 2012-7-20 10:14 编辑

完全可以,我用主循环里面轮番切换端口和AD中断里面切换3次端口都实现了,反正实现了3路采集,其实是一个个来采集...只不过时间快,可以看做是一个时刻取了3个通道3个数据回来

qq1328454800 发表于 2012-7-20 21:17:10

恩,看了说明书后好好研究了一下,最后写出来了,谢谢你啊

孤独将一 发表于 2013-7-9 23:07:33

帮帮忙http://www.amobbs.com/thread-5541729-1-1.html

njsyq 发表于 2013-7-10 14:02:31

以前用M16做过4路AD采样,挺好用的啊。
页: [1]
查看完整版本: atmega16内部AD多路采集