请教单片机发脉冲,定时器Timer1、OCR1A、OCR1B方面的问题
本帖最后由 cciew 于 2017-2-4 23:49 编辑1:arduino uno用的1号定时器, 程序这样写D9(OCR1A)脚 可以发生脉冲!
pinMode(9, OUTPUT);
TCCR1B = 0;
DDRD = 0x08;
TCCR1A = 0x82;
TCCR1B = 0x10;
ICR1=8000000/feb-1;//频率=16MHz/2/feb -1
OCR1A=25*80000/feb;//占空比 %
TCCR1B |= 0x01;
2:现在想用D9,D10(OCR1B),同时发生脉冲,实验结果D9 D10 都不能发生脉冲了!
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
TCCR1B = 0;
DDRD = 0x08;
TCCR1A = 0x82;
TCCR1B = 0x10;
ICR1=8000000/feb-1;//频率=16MHz/2/feb -1
OCR1A=25*80000/feb;//占空比 %
OCR1B=80*80000/feb;//占空比 %
TCCR1B |= 0x01;
请教相关方面的高人,给看看,应该怎样写,谢谢! 本帖最后由 cciew 于 2017-2-4 23:38 编辑
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
TCCR1B = 0;
DDRD= 0x08;
TCCR1A = 0xA1;
TCCR1B = 0x09;
ICR1=8000000/feb-1;//频率=16MHz/2/feb -1
OCR1A=25*80000/feb;//占空比 %
OCR1B=80*80000/feb;//占空比 %
后来改成这样写了, D9 D10可以发生不同占空比的脉冲了,可是又不能改脉冲宽度(频率)了。 :loveliness:看下链接。。。。
http://forum.arduino.cc/index.php/topic,16612.0.html#4 http://playground.arduino.cc/Code/PwmFrequency
http://playground.arduino.cc/Main/TimerPWMCheatsheet
Paderboy 发表于 2017-2-5 08:25
http://playground.arduino.cc/Code/PwmFrequency
http://playground.arduino.cc/Main/TimerPWMCheatshe ...
谢谢Paderboy,资料很详细! 本帖最后由 cciew 于 2017-2-5 21:50 编辑
现在已经搞定了!
用D9,D10(OCR1B),同时发生不同频率的脉冲!
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
TCCR1B = 0;
//DDRD = 0x08;
TCCR1A = 0xA2;
TCCR1B = 0x10;
ICR1=8000000/feb-1;//频率=16MHz/2/feb -1
OCR1A=25*80000/feb;//占空比 %
OCR1B=80*80000/feb;//占空比 %
TCCR1B |= 0x01;
问题主要出在 TCCR1A
TCCR1A = 0xA2;=10100010 ,前面两个10, 表示1A,1B端口使能!
相关知识:
http://www.arduino.cn/thread-11204-1-1.html
http://www.diy-robots.com/?p=852
尤其仔细阅读以下内容:
Janitor 说:
2013/06/05 于 21:16
感谢博主的经验分享。
但是对于原文中以下部分我有一些疑惑。
“这段代码看上去有点晕,其实很简单。_BV(n)的意思就是1< COM2A1,表示COM2A的第1位(靠,其实是第2位,不过程序员们是从0开始数数的)。所以_BV(COM2A1)表示COM2A = 10;类似的,_BV(WGM21) | _BV(WGM20) 表示 WGM2 = 011。”
从ATmega328P datasheet 中的 Register summary中可以找到8位寄存器TCCR2A。COM2A1,COM2B1,WGM21,WGM20是TCCE2A中的位的名称,本身不是寄存器。
Address Name Bit7 Bit6 Bit5 Bit4 Bit3Bit2 Bit1 Bit0
(0xB0) TCCR2A COM2A1 COM2A0 COM2B1 COM2B0 – – WGM21 WGM20
所以_BV(COM2A0)即1<<COM2A0即01000000,依次类推命令
TCCR2A = _BV(COM2A0) | _BV(COM2B1) | _BV(WGM21) |_BV(WGM20)
可以转化为
TCCR2A = 01000000 | 00100000 | 00000010 | 00000001
即
TCCR2A = 01100011
cciew 发表于 2017-2-5 21:48
现在已经搞定了!
用D9,D10(OCR1B),同时发生不同频率的脉冲!
pinMode(9, OUTPUT);
这个好,终于弄个好点的解释了! 好文 学习经验:):):):)
页:
[1]