打印
[AVR单片机]

AVR AD的问题

[复制链接]
1001|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
//将AD转换完成的数据送到数码管显示
#include <avr/io.h>
#include <avr/interrupt.h>
#define uint unsigned int
#define uchar unsigned char
unsigned char table[10]={0xbf,0x30,0x5b,0x4f,0x66,0x6d,0xfd,0x07,0xff,0xef};
unsigned int b[4]={0};
unsigned int a=0;
unsigned int i;

unsigned int ad_convert(void)    //读AD读取的数据
{
        unsigned int temp1,temp2;
        while(!(0x10|ADCSRA)) ;
        temp1=(unsigned int)ADCL;
        temp2=(unsigned int)ADCH;
        temp2=(temp2<<8)+temp1;
        ADCSRA|=0X40;
        return(temp2);
}

void delay(unsigned int z)  
{
        unsigned int i,j;
        for (i=0;i<z;i++)
        {
                for (j=0;j<300;j++)
                {
                        a++;
                }       
        }
}

void display(unsigned int z)         //显示函数
{
        unsigned int b[4]={0};
        b[0]=z/1000;
        b[1]=z%1000/100;
        b[2]=z%100/10;
        b[3]=z%10;
       
        PORTD=0xfe;
        PORTC=table[b[0]];
        delay(10);
        PORTD=0xff;
       
        PORTD=0xfd;
        PORTC=table[b[1]];
        delay(10);
        PORTD=0xff;
       
        PORTD=0xfb;
        PORTC=table[b[2]];
        delay(10);
        PORTD=0xff;
       
        PORTD=0xf7;
        PORTC=table[b[3]];
        delay(10);
        PORTD=0xff;
       
}

void ADC_init()           //ADC初使化
{
        ADCSRA|=0x80;   //ADC使能
        ADMUX=0xc0;      //2.5V片内基准电压源    ADC0通道
        ADCSRA|=0x43;    //启动ADC转换   8分频
}

int main(void)
{
       
        DDRA=0x00;
        PORTA=0x01;
        DDRD=0xff;
        DDRC=0xff;
        ADC_init();
    while(1)
    {
                i=ad_convert();
        display(i);//TODO:: Please write your application code
               
       
    }
}
为什么我的只能显示0到200;,而不是0到1024

相关帖子

沙发
huangxz| | 2014-3-9 22:05 | 只看该作者
你直接用temp = ADC;
不行吗?

使用特权

评论回复
板凳
highend| | 2014-3-9 22:51 | 只看该作者
ADC采集已经正确了 ?
你的问题,我只说点侧面的:
很久以前,用CV AVR自动生成一些代码,挺好的,可以确保采集正确。
b[1]=z%1000/100;
        b[2]=z%100/10;
        b[3]=z%10;  都不加括号啊?


如果最高位始终不现实, 会不会你给的信号太低了?

使用特权

评论回复
评分
参与人数 1威望 +4 收起 理由
qin552011373 + 4
地板
qin552011373| | 2014-3-10 08:38 | 只看该作者
huangxz 发表于 2014-3-9 22:05
你直接用temp = ADC;
不行吗?

貌似有些系列的有个读时序,时序不对,读出来的数据是错的呢

使用特权

评论回复
5
qin552011373| | 2014-3-10 08:51 | 只看该作者
看不出哪里有问题,你用万用表检查一下输入端的电压

使用特权

评论回复
6
qin552011373| | 2014-3-10 08:52 | 只看该作者
huangxz 发表于 2014-3-9 22:05
你直接用temp = ADC;
不行吗?


使用特权

评论回复
7
qin552011373| | 2014-3-10 08:52 | 只看该作者
huangxz 发表于 2014-3-9 22:05
你直接用temp = ADC;
不行吗?

AT48/88/168的

使用特权

评论回复
8
xjl626| | 2014-3-10 10:30 | 只看该作者
1)直接 tmp = ADC; // 个人已验证
2)令 return(tmp2) 改为 令 return(1024);  // 检测显示
3)检查电压AD输入,AD程序初始相关

使用特权

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

本版积分规则

6

主题

27

帖子

0

粉丝