搜索
bottom↓
回复: 10

AVR mega8 对ADC 电流电压采样结果如何传送到MCU

[复制链接]

出0入0汤圆

发表于 2012-11-7 15:02:42 | 显示全部楼层 |阅读模式
AD采样转换的结果单片机是通过什么方式获得,又是怎么利用的?传到MCU后如何控制PWM的输出!
不满大侠,在下想做一个太阳能控制器!求指导!
程序该怎么编写?

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-11-7 15:10:31 | 显示全部楼层
内部AD或者外部AD芯片 读取AD值。。。。然后。。。。。。

出0入0汤圆

 楼主| 发表于 2012-11-7 17:17:00 | 显示全部楼层
yklstudent 发表于 2012-11-7 15:10
内部AD或者外部AD芯片 读取AD值。。。。然后。。。。。。

采用AVR内部自带ADC。。。。跪求大侠指导!

出0入0汤圆

发表于 2012-11-8 20:22:23 | 显示全部楼层
从AVR内部采样到ADC数值,然后可根据ADC值来控制PWM输出就可以了吧

出0入0汤圆

发表于 2012-11-10 08:52:00 | 显示全部楼层
我做个类似的东东,使用AVR自带的ADC和定时计数器,定时计数器用PWM模式,ADC连续的转换,然后把ADC读的电压值对应到定时计数器的匹配值。OK了!

出0入0汤圆

 楼主| 发表于 2012-11-10 15:26:55 | 显示全部楼层
badrobot 发表于 2012-11-10 08:52
我做个类似的东东,使用AVR自带的ADC和定时计数器,定时计数器用PWM模式,ADC连续的转换,然后 ...

能具体点吗?大侠!可否给个蓝本借鉴一下!

出0入0汤圆

发表于 2012-11-12 13:02:41 | 显示全部楼层
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

/*//------宏定义------
#define uchar        unsigned char
#define uint        unsigned int
#define BIT(x)        (1<<(x))
#define NOP()        asm("nop")
#define WDR()         asm("wdr")*/
//------段选宏定义-------
#define Sega    0x01
#define Segb    0x02
#define Segc    0x04
#define Segd    0x08
#define Sege    0x10
#define Segf    0x20
#define Segg    0x40
#define Segdp   0x80

#define Num0    (Sega + Segb + Segc + Segd + Sege + Segf)
#define Num1    (Segb + Segc)
#define Num2    (Sega + Segb + Segd + Sege + Segg)
#define Num3    (Sega + Segb + Segc + Segd + Segg)
#define Num4    (Segb + Segc + Segf + Segg)
#define Num5    (Sega + Segc + Segd + Segf + Segg)
#define Num6    (Sega + Segc + Segd + Sege + Segf + Segg)
#define Num7    (Sega + Segb + Segc )
#define Num8    (Sega + Segb + Segc + Segd + Sege + Segf + Segg)
#define Num9    (Sega + Segb + Segc + Segd + Segf + Segg)
#define Numdp   (Segdp)
#define Numblk  (0)
unsigned  Num_code[12] = {Num0,Num1,Num2,Num3,Num4,Num5,Num6,Num7,Num8,Num9,Numdp,Numblk};

void show(int num)
{        //数码管显示,先段选再位选
        PORTD = Num_code[num/1000];//千
        PORTB |= 0x10;
        _delay_ms(5);
        PORTB = 0;
        PORTD = Num_code[num%1000/100];//百
        PORTB |= 0x4;
        _delay_ms(5);
        PORTB = 0;
        PORTD = Num_code[num%100/10];//十
        PORTB |= 0x2;
        _delay_ms(5);
        PORTB = 0;
        PORTD = Num_code[num%10];//个
        PORTB |= 0x1;
        _delay_ms(5);       
        PORTB = 0;
}


//端口初始化
void port_init(void)
{
        PORTA = 0x00;
        DDRA  = 0x00;
        PORTB = 0x00;
        DDRB  = 0x1F;
        PORTC = 0x01;
        DDRC &= ~0x01;
        PORTD = 0x00;
        DDRD  = 0xFF;
}

//定时器T0初始化
void timer0_init(void)
{
        TCCR0  = 0x00;//停止定时器
        TCNT0  = 0x00;//初始值
        OCR0   = 0x00;//匹配值
        TIMSK |= 0x00;//中断允许
//        TCCR0  = 0x6A;//启动定时器
}



//adc转换初始化
void adc_init(void)
{
        ADCSRA        = 0x00;        //禁止AD转换
        ADMUX        = 0xC0;
        SFIOR |= 0x00;
        ACSR        = 0x80; //禁止模拟比较器
        ADCSRA        = 0xEE;
}


volatile unsigned int adc_calc(void)
{
        //计算实际电压
        unsigned long value=0;
        unsigned int voltage=0; //电压单位为(mV)
        value=ADCL;                 //首先读低位
        value|=(int)ADCH << 8; //然后读高位
        voltage=(value*2560)>>10;
        return voltage;
}


//#pragma interrupt_handler adc_isr:15
//void adc_isr(void)

SIGNAL(SIG_ADC)
{
        //转换完成后中断处理
        //unsigned int voltage;
        OCR0 = adc_calc()/10;
}


void init_devices(void)
{
        cli(); //禁止所有中断
        MCUCR  = 0x00;
        MCUCSR = 0x80;//禁止JTAG
        GICR   = 0x00;
        port_init();
        adc_init();
        timer0_init();
        sei();//开全局中断
}
//主函数
int main(void)
{
        init_devices();
        while(1)
        {
            if(!(PINC&0x01))
                {
                        _delay_ms(20);
                        if(!(PINC&0x01))
                        TCCR0  ^= 0x6A;//启动定时器PWM
                        _delay_ms(20);
                        while(!(PINC&0x01));       
                }       
                 show(adc_calc());
        }
}
这个样就可以了,还带数码管显示ADC的值

出0入4汤圆

发表于 2012-11-12 13:06:22 | 显示全部楼层
如果不是专业的,芯片换成mega168,然后看下这个网站 http://arduino.cc/
需求不是太难的话,几天就能搞定了。

出0入0汤圆

发表于 2012-11-13 19:47:44 | 显示全部楼层
badrobot 发表于 2012-11-12 13:02
#include
#include
#include  


数码管显示和按键扫描这样写是有非常严重的问题的。

出0入0汤圆

 楼主| 发表于 2012-11-16 17:32:03 | 显示全部楼层
badrobot 发表于 2012-11-12 13:02
#include
#include
#include  

非常感谢大侠。

出0入0汤圆

发表于 2013-11-22 22:55:05 | 显示全部楼层
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 18:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表