AVR 定时器快速PWM模式使用
PWM很常用,AVR自带内部PWM功能,分为快速PWM模式和相位修正PWM模式。
我们这里选择方式15 ,由OCR1A保存上限值,由OCR1B保存匹配值,所以输出管脚 OCR1A不能输PWM,只能有OCR1B输出PWM信号。
如果用方式 5,6,7模式 上限值是固定的,所以我们就可以用OCR1A和OCR1B保存匹配值
OCR1A和OCR1B都可以输出PWM信号。
快速PWM时序图
根据此公式计算出OCR1A和OCR1B的数值
OCR1A:
1,11059200 / 100 /64 = 1728 // 11.0592MHz晶振系数 / 100Hz频率 / 64分频
2,1728 - 1 = 1727 //得到上限值,赋值给OCR1A
OCR1B:
1,1727 / 5 = 345.4 ( 取值为345 ) //得到匹配值,设定为2ms,赋值给OCR1B
100Hz表示每秒震动100次,所以周期是1s / 100 = 0.01s 即10ms
100Hz周期是10ms,要定时2ms即用 1727 / 5 =345.4 取值为345
所以也可以知道产生的是占空比为20%的PWM信号
测试代码:
#include <iom16.h>
void FastPWM(void)
{
DDRD_Bit4 = 1; // OC1B 管脚设置为输出
DDRD_Bit5 = 1; // OC1A 管脚设置为输出
TCCR1A=(0<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(0<<COM1B0)|(1<<WGM11)|(1<<WGM10);
// OC1A 作为上限值 电平取反 OC1B 作为比较值 比较匹配时清零,到达上限值是置1
// TCCR1A ==> COM1A1 , COM1A0 , COM1B1 , COM1B0 , FOC1A , FOC1B , WGM11 , WGM10
// 0 1 1 0 无关 无关 1 1
TCCR1B=(1<<WGM13)|(1<<WGM12)|(0<<CS12)|(1<<CS11)|(1<<CS10);
// 波形产生模式15 , 64分频
// TCCR1B ==> ICNC1 , ICES1 , - , WGM13 , WGM12 , CS12 , CS11 , CS10
// 无关 无关 1 1 0 1 1
OCR1A=1727; // 晶振频率 11.0592MHz , 设定 100Hz PWM信号 , 64分频
OCR1B=345; // 为2ms的高电平持续时间
}
void main(void)
{
FastPWM();
}
- 5. avr定时器/计数器1 --TC1 --快速PWM输出 (比较输出--快速PWM模式)
- 2. avr定时器/计数器0 --TC0 --快速PWM输出 (比较输出--快速PWM模式)
- AVR——使用定时器必须弄清的几个概念!
- AVR中定时器的使用
- AVR——使用定时器必须弄清的几个概念
- IAR FOR AVR 定时器中断的使用
- AVR——使用定时器必须弄清的几个概念
- AVR使用范例--定时器实现PWM功能
- IAR For AVR 定时器溢出中断 (使用小结)
- AVR单片机使用外部中断和定时器的NEC红外解码程序
- AVR 定时器使用范例
- IAR For AVR 定时器溢出中断 (使用小结)
- 项目管理---git----快速使用git笔记(七)------coding.net项目管理多人操作的流程规范--合并代码审核
- Spark快速入门指南 – Spark安装与基础使用
- [RTT例程练习] 4.1 定时器基本使用
- Lombok快速安装与使用手册
- [32位汇编系列]005 - 定时器的使用(1)
- 超强干货!快速使用u盘win7系统安装教程图
- J2EE 快速开发平台 demo使用说明
- 使用mysqlreplicate命令快速搭建 Mysql 主从复制