ATmega16有没有可能产生两路16位PWM输出?
课程设计中用PWM做输出控制比例阀,用ADC接收压力传感器的信号,可是测下来特性曲线不太好,可利用线性部分太窄(如图),所以想将现在8位的PWM改为16位,以提高精度。不知道,ATmega16有没有可能输出两路16位的PWM信号?OC1应该是可以的吧。OC0和OC2都是8位的,有没有办法把他们合并成16位的?
谢谢!
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_311542.gif
(原文件名:adc-pwm.gif) 有OC1A与OC1B OC1A和OC1B如果同时用的话,好像只能生成两路8位PWM信号吧;如果要16位的话,OC1A和OC1B只能一路输出吧。
以前好像看到过一个贴子,说是把OC0和OC2合起来当16为计数器用,就可以输出16位PWM信号了。可是这个贴子找不到了。 /*****************************************************
www.avrdiy.com panxiaoyi
CodeWizardAVR V1.25.9 Professional
Chip type : ATmega16L
Program type : Application
Clock frequency : 8.000000 MHz
Memory model : Small
External SRAM size: 0
Data Stack size : 256
*****************************************************/
#include <mega16.h>
void main(void)
{
TCCR1A = 0b10100010; //快速PWM
TCCR1B = 0b00011001; //时钟1分频
ICR1H= 0xFF; //TCNT计数上限(最高16位)
ICR1L= 0xFF;
DDRD = 0x30; //PWM输出
while (1)
{
OCR1AH=0x7F; //设置OCR0A的占空比1:2
OCR1AL=0xFF;
OCR1BH=0x3F; //设置OCR0B的占空比1:4
OCR1BL=0xFF;
};
} lz观点有误,M16可以产生2路16位pwm信号,只是频率相同。 【2楼】 chenglong 成龙
瞎讲,OC1A和OC1B同时产生PWM都是16位的
频率一致因为公用一个16位计数器
占空比可分别调节因为16比较寄存器有2套 本来以为没人回复了,家里又没网络,所以就没再来看。今天发现,还竟然有朋友把代码都贴出来了,真的是好感动。
非常感谢各位的帮助。我试一下,希望能够成功。 再次谢谢【3楼】 panxiaoyi 啊艺!
#include <stdlib.h>
#include <avr/io.h>
int pwm16_Init(unsigned char pwmbit)
{
TCCR1A = 0b10100010; //Fast PWM
TCCR1B = 0b00011001; //No prescaling
unsigned int icr1_temp=0x0000;
if (pwmbit>16) pwmbit=16;
for (;pwmbit>0;pwmbit--)
icr1_temp=icr1_temp+(1<<(pwmbit-1));
ICR1=icr1_temp;
DDRD = 0x30; //PWM Output
OCR1A=0;
OCR1B=0;
return 0;
} 不错 好贴,收藏 MARK 学习学习 学习一下 mark!{:lol:}
页:
[1]