打印
[AVR单片机]

ICC AVR模数转换的问题,求指教

[复制链接]
1059|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
用ICC-AVR模数转换的问题,数据显示不正常,AD输入接PA7,四位数码管位选接PA0~PA3,段选接Pc口,参考电压选择2,56v基准电压,实际测定的电压是1.49v,预期数码管应该显示的是596,但结果却显示1023,而且改变他的电压数据会变化,但结果还是不变,望哪位大神指教下,谢谢!以下是程序:

#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int

unsigned char smg_du[]={0xee,0x28,0xb6,0xba,0x78,0xda,0xde,0xa8,0xfe,0xfa};
unsigned char smg_we[]={0x01,0x02,0x04,0x08};
uchar table[8]={0,0,0,0,0,0,0,0};

void init (void)
{
DDRA=0x0f;
PORTA=0;

DDRC=0xff;                  //01111000
PORTC=0;
}

void delay(void)
{
uint a;
for(a=0;a<300;a++);
}

/*
void display(uchar *p)
{
uchar i;
for(i=0;i<4;i++)
{
  PORTA=smg_we[i];
  PORTC=smg_du[table[i]];
  delay();

}
}
*/

adc_init(void)
{
DDRA&=~BIT(7);
PORTA&=~BIT(7);

ADMUX=0xc7;
ADCSRA=0xe8;
SFIOR=0x00;
SREG|=BIT(7);
}

void data_pro(uint temp_1,uint temp_h)
{
uint i,temp1,temp2;
temp1=temp_h*256;         
temp2=temp1+temp_1;      
table[0]=temp2/1000;
temp1=temp2%1000;
table[1]=temp1/100;
temp2=temp1%100;
table[2]=temp2/10;
table[3]=temp2%10;

for(i=0;i<4;i++)
{
  PORTA=smg_we[i];
  PORTC=smg_du[table[i]];
  delay();
  }
}


void main(void)
{
init();
adc_init();
while(1);
}

#pragma interrupt_handler adc_isr:15
void adc_isr(void)
{
uint adc_1,adc_h;
if(ADCSRA=0xe8)
{
adc_1=ADCL;
adc_h=ADCH;
data_pro(adc_1,adc_h);
}
}

相关帖子

沙发
wangch_sh| | 2014-7-15 16:28 | 只看该作者
而且改变他的电压数据会变化,但结果还是不变
到底是变还是不变?

使用特权

评论回复
板凳
远里歌声|  楼主 | 2014-7-15 17:57 | 只看该作者
wangch_sh 发表于 2014-7-15 16:28
而且改变他的电压数据会变化,但结果还是不变
到底是变还是不变?

就是改变电路的电阻,即输入引脚的电压应该变化,但是数码管的显示一直不变(理论应该也变的)

使用特权

评论回复
地板
wangch_sh| | 2014-7-15 18:00 | 只看该作者
是不是没配置对?查手册。

使用特权

评论回复
5
yubsh| | 2014-7-15 22:46 | 只看该作者
1,先给数码管送固定数据,看数码管是否显示正常
2,假定ADC寄存器值为固定数据,看运算是否正确
3,加实际电压

使用特权

评论回复
6
远里歌声|  楼主 | 2014-7-15 23:46 | 只看该作者
yubsh 发表于 2014-7-15 22:46
1,先给数码管送固定数据,看数码管是否显示正常
2,假定ADC寄存器值为固定数据,看运算是否正确
3,加实际 ...

数码管显示正常,就是关于AD转换方面不知道哪里出错了(怎么设置知道ADC寄存器的数值是多少呢),加实际电压的话就是开始所说的那样

使用特权

评论回复
7
远里歌声|  楼主 | 2014-7-15 23:48 | 只看该作者
wangch_sh 发表于 2014-7-15 18:00
是不是没配置对?查手册。

查过了,不知道哪里出错了。。。

使用特权

评论回复
8
zhujunjiejuan| | 2014-7-16 14:51 | 只看该作者
AD转换转换几次?是不是要多次采样取一个平均值,有可能上电之后电路不稳定造成单片机采样出现问题呢?

使用特权

评论回复
9
yubsh| | 2014-7-17 00:30 | 只看该作者
远里歌声 发表于 2014-7-15 23:46
数码管显示正常,就是关于AD转换方面不知道哪里出错了(怎么设置知道ADC寄存器的数值是多少呢),加实际 ...

我意思是,人为修改adc中断,把ADCH,ADCL设成固定的数据,然后看看你的运算有没有问题。

void adc_isr(void)
{
uint adc_1,adc_h;
if(ADCSRA=0xe8)
{
adc_1=0xff; //ADCL;
adc_h=0x03; //ADCH;
data_pro(adc_1,adc_h);
}
}

使用特权

评论回复
10
远里歌声|  楼主 | 2014-7-18 16:17 | 只看该作者
yubsh 发表于 2014-7-17 00:30
我意思是,人为修改adc中断,把ADCH,ADCL设成固定的数据,然后看看你的运算有没有问题。

void adc_isr(v ...

OK,现在调整好了,谢谢各位~~

使用特权

评论回复
11
远里歌声|  楼主 | 2014-7-18 16:40 | 只看该作者
本帖最后由 远里歌声 于 2014-7-18 16:43 编辑
yubsh 发表于 2014-7-17 00:30
我意思是,人为修改adc中断,把ADCH,ADCL设成固定的数据,然后看看你的运算有没有问题。

void adc_isr(v ...

怎么结贴老是提示失败呢,分数分配没有问题啊《,,

使用特权

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

本版积分规则

4

主题

13

帖子

0

粉丝