打印
[AVR单片机]

【求解】M16 AD两通道采集数值一样

[复制链接]
2171|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wnwnwn|  楼主 | 2013-6-6 11:49 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 wnwnwn 于 2013-6-15 19:43 编辑

麻烦大家帮我看下这段程序,为什么两个通道采集上来得数据都是一样的,而且实时改变输入值,采集无变化。
我在网上查说是要先采集ADCL,然后再采集ADCH数据,可程序确实是先低后高,怎么还是不行呢?


#define F_CPU 4000000UL
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>

typedef unsigned char INT8U;
typedef unsigned int INT16U;

const PROGMEM INT8U SEG_CODE[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xff};
volatile INT8U Display_Buffer[] = {0, 0, 0, 10, 0, 0, 0, 10};

void ADC_Convert(INT8U CH);

int main(void)
{
        INT8U i;
        DDRA = 0xfc;
        DDRC = 0xff; PORTC = 0x00;
        DDRD = 0xff; PORTD = 0x00;
        ADCSRA = 0xe6;
        SFIOR = 0x00;
        _delay_ms(3000);
        while (1)
        {
                ADC_Convert(0);
                ADC_Convert(1);
                for (i = 0; i < 8; i++)
                {
                        PORTC = 0xff;
                        PORTD = _BV(i);
                        PORTC = pgm_read_byte(&SEG_CODE[Display_Buffer]);
                        if (i == 0 || i == 4)
                             PORTC &= 0x7f;
                        _delay_ms(4);
                }
        }
}

void ADC_Convert(INT8U CH)
{
        INT16U Result;
        if (CH == 0)
                ADMUX = 0x40;
        else
                ADMUX = 0x41;
        //Result = (int)(ADC * 500.0 / 1023.0);
        Result = (INT16U)((ADCL + (ADCH << 8)) * 500.0 / 1024.0);
        Display_Buffer[CH * 4] = Result / 100;
        Display_Buffer[CH * 4 + 1] = Result / 10 % 10;
        Display_Buffer[CH * 4 + 2] = Result % 10;
}

avr ad连续转换.rar (51.11 KB)



相关帖子

沙发
qin552011373| | 2013-6-6 13:52 | 只看该作者
程序没有注释啊 你用的哪种采样方式?

使用特权

评论回复
板凳
wnwnwn|  楼主 | 2013-6-6 14:35 | 只看该作者
qin552011373 发表于 2013-6-6 13:52
程序没有注释啊 你用的哪种采样方式?

是独立通道连续转换模式

使用特权

评论回复
地板
qin552011373| | 2013-6-6 16:53 | 只看该作者
wnwnwn 发表于 2013-6-6 14:35
是独立通道连续转换模式

你把附件上传一下 回去后帮你看看

使用特权

评论回复
5
宇容创行| | 2013-6-6 21:06 | 只看该作者
要等ad转换完成后再读

使用特权

评论回复
6
wnwnwn|  楼主 | 2013-6-7 09:12 | 只看该作者
qin552011373 发表于 2013-6-6 16:53
你把附件上传一下 回去后帮你看看

程序的工程文件和仿真图已经上传了,麻烦您帮着看下吧。:handshake

使用特权

评论回复
7
wnwnwn|  楼主 | 2013-6-7 09:12 | 只看该作者
宇容创行 发表于 2013-6-6 21:06
要等ad转换完成后再读

那程序应该怎么修改呢?

使用特权

评论回复
8
qin552011373| | 2013-6-7 09:30 | 只看该作者
wnwnwn 发表于 2013-6-7 09:12
那程序应该怎么修改呢?

把ADC转换完成的中断打开

使用特权

评论回复
9
wnwnwn|  楼主 | 2013-6-7 10:07 | 只看该作者
qin552011373 发表于 2013-6-7 09:30
把ADC转换完成的中断打开

可是程序当中并没有写中断函数

使用特权

评论回复
10
qin552011373| | 2013-6-7 12:51 | 只看该作者
wnwnwn 发表于 2013-6-7 10:07
可是程序当中并没有写中断函数

你不回加上啊  程序是你自己写的吗?

使用特权

评论回复
11
wnwnwn|  楼主 | 2013-6-7 19:33 | 只看该作者
qin552011373 发表于 2013-6-7 12:51
你不回加上啊  程序是你自己写的吗?

不是的,是彭伟那本avr书上的,然后功能实现不了就发帖子问下。

使用特权

评论回复
12
qin552011373| | 2013-6-7 20:02 | 只看该作者
wnwnwn 发表于 2013-6-7 19:33
不是的,是彭伟那本avr书上的,然后功能实现不了就发帖子问下。

书名?有电子版?我研究下

使用特权

评论回复
13
wnwnwn|  楼主 | 2013-6-7 21:12 | 只看该作者
qin552011373 发表于 2013-6-7 20:02
书名?有电子版?我研究下

单片机C语言程序设计实训100例:基于AVR+PROTEUS仿真 作者:彭伟
网上很多pdf资源

使用特权

评论回复
14
qin552011373| | 2013-6-8 06:45 | 只看该作者
wnwnwn 发表于 2013-6-7 21:12
单片机C语言程序设计实训100例:基于AVR+PROTEUS仿真 作者:彭伟
网上很多pdf资源 ...

ok

使用特权

评论回复
15
zezy371| | 2013-6-11 16:08 | 只看该作者
缺了个等待ADC转换完成的语句

使用特权

评论回复
16
zezy371| | 2013-6-11 16:09 | 只看该作者
比如while(!(ADCSRA&(1<<ADIF)));

使用特权

评论回复
评论
wnwnwn 2013-6-15 19:44 回复TA
问题已解决,谢谢您啦! 
17
wnwnwn|  楼主 | 2013-6-12 09:43 | 只看该作者
zezy371 发表于 2013-6-11 16:09
比如while(!(ADCSRA&(1

好的,谢谢您,我去试下

使用特权

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

本版积分规则

12

主题

60

帖子

0

粉丝