打印
[AVR单片机]

请教ad转换通道的问题

[复制链接]
3028|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huamunv|  楼主 | 2009-12-20 23:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<avr/io.h>
#include<avr/interrupt.h>
#include <util/delay.h>       //GCC中的延时函数头文件
#define uchar unsigned char
unsigned char js,temp;
unsigned int ad1,ad2,ad3,ad[3],value;
unsigned char  table[]={0x3F,0x6,0x5B,0x4F,0x66,0x6D,0x7D,0x7,0x7F,0x6F,};
void ad_init(void);
void init(void);
void Delayus(unsigned int lus);
void Delayms(unsigned int lms);
void display(uchar temp);
int main(void)
{
        init();
        ad_init();
        while(1)
        {
                ;
        }
        return 0;
}
void init(void)
{
        DDRA=0XFC;
        PORTA=0XFF;
        DDRB=0XFF;
        PORTB=0X0;
        DDRD=0XFF;
        DDRC=0XFF;
        PORTD=0XFF;
        PORTC=0XFF;
}
void Delayus(unsigned int lus)
{
        while(lus--)
        {
                _delay_loop_2(2);      //_delay_loop_2(1)是延时4个时钟周期,参数为2则延时8
                                      //个时钟周期,本实验用8M晶体,则8个时钟周期为8/8=1us
    }
}
void Delayms(unsigned int lms)
{
        while(lms--)
        {
                Delayus(1000);        //延时1ms
    }
}
void display(uchar temp)
{
        uchar shi,ge;
        shi=temp/10;
        ge=temp%10;
        PORTD=0XFd;
        PORTC=table[shi];
        //PORTB=0xfc;
        Delayms(1);
        PORTD=0xFe;
        PORTC=table[ge];
        //PORTB=0XFC;
        Delayms(1);
}
void ad_init(void)
{

        ADCSRA=0X0;//关闭adc转换;
        cli();//清楚全局中断
        ADMUX|=(1<<REFS0)|(1<<REFS1)|(1<<ADLAR);//内部基准电压,模拟通道1
        //ADMUX|=(0<<REFS0)|(0<<REFS1)|(1<<ADLAR)|(1<<MUX0);//内部基准电压,模拟通道1
        //ADMUX|=(1<<REFS0)|(1<<REFS1)|(1<<ADLAR);//内部基准电压,模拟通道1
        ACSR|=(1<<ACD);//关闭模拟比较通道;
        ADCSRA|=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1);//使能ad转换,设置分频系数为64分频
        sei();//打开全局中断
        ADCSRA|=(1<<ADSC)|(1<<ADIE);//启动adc转换,并且转换结束之后进入中断
        /*
                此时进入的ad转换为第一通道为ad0,
        */
        
}
ISR(ADC_vect)
{
        //PORTB=0X08;
        //value=ADCL;
        //value=(unsigned long)ADCH<<8;//获得转换后的数值
        value=(int)((long)(ADCH) * 5010/1024);
        ad[js]=value;
        js++;
        if(js==3)//存放在数组之中
        {
          js=0;
          //PORTB=0X08;
          ad1=ad[0];
          ad2=ad[1];
          ad3=ad[2];
        }
        display(ad1);
        Delayms(1);
        //display(ad2);
        //Delayms(10);
        
        switch(js)//通道的转换
        {
                case 0:
                       ADCSRA|=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(0<<ADIE)|(0<<ADSC);//关中断跟adc的转换
                           ADMUX|=(1<<REFS0)|(1<<REFS1);//选择ad转换的通道0
                           ADCSRA|=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADIE)|(0<<ADSC);//开中断

                           break;
                case 1:
                       ADCSRA|=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(0<<ADIE)|(0<<ADSC);
                           ADMUX|=(1<<REFS0)|(1<<REFS1)|(1<<MUX0);
                           ADCSRA|=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADIE)|(0<<ADSC);
                           break;

      /* case 2:
                       ADCSRA|=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(0<<ADIE)|(0<<ADSC);
                           ADMUX|=(1<<REFS0)|(1<<REFS1)|(1<<MUX1)|(0<<MUX0);
                           ADCSRA|=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADIE)|(0<<ADSC);
                          // PORTB=0X02;
                           break;*/

        }

         ADCSRA|=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADIE)|(1<<ADSC);//启动adc转换         
        
}
采集到得数据一直都是通道二的数据,通道一一直采集不到,不知道为什么,

        display(ad1);
        Delayms(1);
为通道一得数据,

//display(ad2);
        //Delayms(10);为通道二的数据

相关帖子

沙发
huamunv|  楼主 | 2009-12-20 23:27 | 只看该作者
不知道为题出在哪里

使用特权

评论回复
板凳
linhai1986| | 2009-12-21 00:25 | 只看该作者
好长的程序,先看看

使用特权

评论回复
地板
宇容创行| | 2009-12-22 16:03 | 只看该作者
代码写的实在太乱了,楼主自己检查吧

通道切换,要丢弃第一个采样值,

使用特权

评论回复
5
928315| | 2009-12-23 23:37 | 只看该作者
切换通道,不用再去配置时钟这些吧。。。。。

使用特权

评论回复
6
huamunv|  楼主 | 2009-12-26 22:50 | 只看该作者
写程序不太擅长,可不可以给个小例子参考下?

使用特权

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

本版积分规则

88

主题

730

帖子

1

粉丝