【转】AVR单片机同时产生三路PWM的程序和PWM转电压电流电路
用ATmega8的T/C1和T/C2可以产生三路PWM 信号.快速PWM 的产生就是先设定一个TOP值再设定一个比较值,然后,计数器开始计数,比如保持输出1,计数到设定的比较值时,电平变为0,并维持,然后继续计数到TOP
电平再变为1,如此重复循环.
1.T/C1可以产生2路(OC1A即PB1 OC1B即PB2).T/C2产生一路(OC2即PB3).
2.需要设定T/C1的寄存器有四个 TCCR1A TCCR1B(这两个寄存器一起决定了两路PWM信号的产生方式,频率和TOP值) OCR1A(此值/TOP就是占空比) OCR1B(设定第二路PWM的占空比)
2.需要设定T/C2的寄存器有2个TCCR2(同理,这个寄存器决定了第三路PWM信号的产生方式,频率和TOP值 ) OCR2(这个寄存器决定占空比)
上面所述只能产生几个固定频率的PWM信号(占空比可以随便调),并且前两路的频率是一样的.如果想产生自己想要频率的PWM,需要用OCR1A 设定OCR1B的TOP值,由OCR1B产生PWM,此时OCR1A只能产生占空比50%的PWM.
下面是我用ATmega8产生三路频率31.25K,占空比分别为1/3 1/2 2/3 PWM 的程序. 8M
#include<avr/io.h>
int main(void)
{
PORTB=0x00;
DDRB=0x0E;
// T/C1 初始化
TCCR1A=0xA1;
TCCR1B=0x09; //匹配时清零,TOP:255,频率:8M/256=31.25K
OCR1A=85; //占空比:1/3
OCR1B=128; //占空比:1/2
// T/C2 初始化
TCCR2=0x69; //匹配时清零,TOP:255,频率:31.25K
OCR2=170; //占空比:2/3
while (1);
}
http://cache.amobbs.com/bbs_upload782111/files_43/ourdev_662044JIQFNC.jpg
PWM转成电压电路图其中G15A为地 (原文件名:a.jpg)
http://cache.amobbs.com/bbs_upload782111/files_43/ourdev_662045VCUMPH.jpg
pwm转成电流电路 (原文件名:b.jpg) 好贴,值得学习
mark值得学习
好贴,怎么没人顶啊 这个帖子是绝对值得顶一下的。 好东西,学习一下 请问这3路波形的起点是同时的吗?还是一个接一个的输出来 分辨率做到了多少?噪声做到多大?看这个设计数字噪声问题解决的貌似不是很好。我也是用的AVR,16bit的PWM,2.048V基准,我AG34401测试0~2.048V全程范围内最多AG34401最后一位跳一个字
http://bbs.ednchina.com/BLOG_ARTICLE_3010874.HTM mark 学习下 学习记号备用 可以4-20ma输出么? Mark←ing Mark→ing mark 还有类似的帖子吗
页:
[1]