[求助] 求解答下AD测量电压用串口显示遇到的小问题

无敌小青年   2012-4-10 14:23 楼主

#include<iom128v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
#define BAUD 9600
#define F_CPU 8000000
#pragma interrupt_handler usart0jieshou:19

unsigned int ADdata;//AD转换获得的数据

 

//延时函数
void delay(uint ms)
{
 uint i,j;
 for(i=0;i<ms;i++)
  for(j=0;j<1141;j++);
}

 

//端口初始化
void port_init()
{
  PORTA=0X00;
  DDRA=0X00;//ADC通道设置为输入并且高阻态
}

 

//USART寄存器配置
void usart_init(void)
{
  UCSR0B=0X00;//关闭所有USART0的使能
  UCSR0A=0B00000000;//bit1为0对波特率加倍无作用
  UCSR0C=0X06;//奇偶模式无,8位数据位,1位停止位,异步模式
  UBRR0L = (F_CPU / BAUD / 16 - 1) % 256;
  UBRR0H = (F_CPU / BAUD / 16 - 1) / 256;
  UCSR0B|=(1<< RXEN0)|(1<< TXEN0)|(1<<RXCIE0);//发送接收使能,接收结束使能
 
}

 

//字节发送函数
void usart_putchar(uchar y)
{
  while(!(UCSR0A&(1<<UDRE0)));//只有数据寄存器为空才能发送数据
  UDR0=y;
}

 

//接收中断函数
void usart0jieshou()
{
  uchar x;
  x=UDR0;
  usart_putchar(x);
}

 

//AD转换初始化
void AD_init()
{
  ADCSRA=0X00;//ADC关闭
  ADMUX|=(1<<REFS0);//2.56v的片内基准电压源,ADC结果右对齐,选择通道ADC0
  ACSR=0X80;//模拟比较器的控制和状态寄存器禁用
  ADCSRA |= (1 << ADEN)|(1 << ADPS2) | (1 << ADPS1);//使能AD转换,ADC时钟8分频
}

 

//AD转换函数
unsigned int AD_getdata()
{
 ADCSRA |= (1 << ADSC);//开始AD转换
 while(!(ADCSRA & (1 << ADIF)));//等待转换完成
 ADCSRA |= (1 << ADIF);//清零ADC中断标志位
    ADC=ADCL+ADCH*256;
 return ADC;//返回ADC值
}

void main()
{
  port_init();
  usart_init();
  AD_init();
  SEI();
  while(1)
  {
    ADdata=(int)((long)AD_getdata()*5010/1024);
 usart_putchar(ADdata / 1000 + 0x30); //得到电压值的千位并发送
 usart_putchar('.'); //发送小数点
 usart_putchar(ADdata % 1000 / 100 + 0x30); //得到电压值的百位并发送
 usart_putchar(ADdata % 100 / 10 + 0x30);  //得到电压值的十位并发送
 usart_putchar(ADdata % 10 + 0x30); //得到电压值的个位并发送
 usart_putchar('V');  //发送电压符号"V"
 usart_putchar(0x0d);//
 usart_putchar(0x0a); //  AD值发送结束,回车换行
 delay(1000);

  }

}

 

这是我自学编的一个AD小例子,测量开发板上电压的变化,通过串口显示在电脑上,但是遇到了一个问题  串口能显示,但是总是循环显示最小值和当前值

 

  • QQ截图20120410142230.png

回复评论 (9)

回复 楼主 无敌小青年 的帖子

RV2拨到最小能显示最小值 0.042V 但是拨到其他阻值的时候 就交替着既显示当前值又显示最小值 希望懂的人帮帮我 谢谢
点赞  2012-4-10 14:25
来位好心人帮帮我吧
点赞  2012-4-10 14:41

回复 楼主 无敌小青年 的帖子

点击进来浏览的也多 为啥就没个愿意帮帮我呢
点赞  2012-4-10 16:03
你用万用表量一下AD输入脚的电压有没有变化,看看到底是不是程序有问题还是输入有问题啊
点赞  2012-4-11 12:07

回复 5楼 xiaojiong886 的帖子

谢谢你回复我 我去试试 。。。
点赞  2012-4-11 12:56

回复 5楼 xiaojiong886 的帖子

测量电路板上的输出电压 跳动比我测得的值还要过分 但是我输入外部电压还是显示正确值与最小值循环着  帮帮我吧 谢谢
点赞  2012-4-11 15:53

回复 楼主 无敌小青年 的帖子

0.042V
0.042V
0.042V
0.042V
0.042V
0.042V
0.828V
0.042V
0.828V
0.042V
0.828V
0.042V
0.828V
0.042V
0.828V
2.844V
0.042V
2.844V
0.042V
2.844V
0.042V
2.844V
0.042V
2.844V
3.122V
3.373V
3.373V
3.122V
3.122V
3.373V
3.122V
3.373V
3.122V
3.373V
3.373V
4.300V
4.300V
4.300V
4.300V
4.300V
4.300V
4.300V
4.300V
4.300V
4.300V
4.300V
4.300V
4.300V
4.924V
4.924V
4.924V
4.924V
4.924V
4.924V
4.924V
4.924V
4.924V
4.924V
4.924V
4.924V  电压在由最低调到最大时  串口上的显示
点赞  2012-4-11 17:45
求求你们帮帮我吧 我都要逼疯了 下周得交给老师检查的  我邮箱lixiao7517@163.com     QQ751711054  手机15842671831  拜托了  真的很急
点赞  2012-4-11 19:30

ADMUX|=(1<<REFS0);

//2.56v的片内基准电压源,ADC结果右对齐,选择通道ADC0

 

ADdata=(int)((long)AD_getdata()*5010/1024);

 

 

既然选择了内部2.56V 那这个公式为什么又是5010/1024

点赞  2012-4-18 16:21
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复