打印
[AVR单片机]

mega16的AD问题

[复制链接]
1820|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
海飏之心|  楼主 | 2013-6-24 13:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 海飏之心 于 2013-6-24 13:54 编辑

mega16的AD使用问题
最近要用mega16来做电压采集,但是遇到一个很奇怪的问题,使用手动触发(利用串口中断来触发)的方式来采样,不管AD输入是否变化,转换结果一直是第一次采样的值。但是如果使用自动触发的方式(没有更改SFIO,默认值),采样结果就与AD输入同步变化。代码如下:
手动触发与自动触发
void adc_init()
{
    PORTA = 0X00;         
    DDRA = 0x00;   //ADC通道设置为输入口,高阻态   
    ADMUX |= (1 << REFS0) | (1 << MUX0);   //ADC参考电压为AVcc,选择通道ADC1     
    ADCSRA |= (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1)| (1 << ADPS0)|(1<<ADIE );   //使能AD转换,ADC时钟128分频,使能中断,串口中断触发用的是这一语句
   // ADCSRA |= (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1)| (1 << ADPS0)|(1<<ADIE )|(1<<ADATE);  //自动触发用的是这个语句,并使用默认触发源
   
}
void transfer()
{
        unsigned char data;
        ADCSRA |= (1 << ADSC);     //开始AD转换
}
int main(void)
{
    //DDRA=0x00;    //设置PORTA为输入
    //PORTA=0xff;    //设置为无上拉电阻输入
    DDRB=0x00;    //设置PORTA为输入
    PORTB=0xff;    //设置为无上拉电阻输入
    DDRC=0xff;    //
    PORTC=0x00;    //
    wdt_disable();
    uart_init(); //初始化串口
    adc_init();//初始化AD
    sei();  //开总中断
    while(1);
}

ISR(USART_RXC_vect)
{
    unsigned char status;
    status=UCSRA;    //读取接收状态标志位,必须先读,当读了UDR后,UCSRA便自动清零了
    status=UDR;    //读取USART数据寄存器
    if(status=='o')
    {
         RBI__(PORTC,7);
        transfer();//触发采样
    }
}

ISR(SIG_ADC)
{
    unsigned char data;
    RBI__(PORTC,6);
    ADCSRA|=(1<<ADIF);     
    data=ADCH;              
    while((UCSRA&0x20)==0);
        UDR=data;
        data=ADCL;   
    while((UCSRA&0x20)==0);
        UDR=data;
}

相关帖子

沙发
bjart| | 2013-6-24 14:09 | 只看该作者
没细看你的程序,AVR好久没有用了,凭经验说两句,希望对你有帮助

读ADC的时候读完高位后再读一个低位(即便低位对你来说没有用)
ADCSRA|=(1<<ADIF);
  data=ADCL; //必须先读低位后读高位
  data=ADCH;

使用特权

评论回复
评分
参与人数 2威望 +7 收起 理由
海飏之心 + 1 很给力!
qin552011373 + 6
板凳
海飏之心|  楼主 | 2013-6-24 21:23 | 只看该作者
厄,必须先读低八位?明天回去试试,如果真这样真的是坑爹。线先行谢过哈:lol

使用特权

评论回复
地板
海飏之心|  楼主 | 2013-6-25 21:57 | 只看该作者
怎么没办法结贴的···前辈的说法是对的,要先读低八位~!!!

使用特权

评论回复
5
qin552011373| | 2013-6-26 01:17 | 只看该作者
海飏之心 发表于 2013-6-25 21:57
怎么没办法结贴的···前辈的说法是对的,要先读低八位~!!!

你在论坛搜一下   结贴很简单的

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
海飏之心 + 1 很给力!
6
gdxizhilang| | 2013-6-26 08:03 | 只看该作者
:):),来晚了

使用特权

评论回复
7
海飏之心|  楼主 | 2013-6-27 22:45 | 只看该作者
qin552011373 发表于 2013-6-26 01:17
你在论坛搜一下   结贴很简单的

是分数不够···

使用特权

评论回复
8
qin552011373| | 2013-6-28 00:08 | 只看该作者
海飏之心 发表于 2013-6-27 22:45
是分数不够···

无法结贴?

使用特权

评论回复
9
pallee| | 2013-6-29 21:38 | 只看该作者
学习一下小知识。

使用特权

评论回复
10
wentao0100| | 2013-7-3 21:48 | 只看该作者
开启转换之后要延时,然后再读取数据

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

31

帖子

1

粉丝