最新动态

工业物联网通讯专家!
认真做好每一件事,设计简单、可靠、价格合理的产品!

avr单片机 PWM 超级函数 可以设置周期为2us~65ms

共享超级PWM设置函数 可以设置周期为2us~65ms 可设占空比 2路PWM,使用定时器1,16位定时器,已经在电机控制产品中使用

实测2us~65ms 非常准确
void pwmIint_us(uint16 zhouqi_us,uint16 high_us_A,uint16 high_us_B)
三个参数为 周期,第一路高电平时间,第二路高电平时间。

古欣 版权所有,转载请注明出处

请自行定义部分内容

要直接编译 还需要加一些定义,如包含头文件,增加类型定义。
typedef unsigned char uint8;

typedef unsigned int uint16;

#define F_CPU_M   7.3728 #define DDR_OC1   DDRB #define PORT_OC1A PB1 #define PORT_OC1B PB2 #define CKDIV_0     0 #define CKDIV_1     1 #define CKDIV_8     2 #define CKDIV_64   3 #define CKDIV_256   4 #define CKDIV_1024   5 //Time=PRE*(MAX-TCNT0+1) /F_cpu 这里time以秒为单位 F_cpu以hz为单位 //Time*F_cpu=PRE*MAX //Max=Time*F_cpu/pre; //2us ~ 65000us (65ms) void pwmIint_us(uint16 zhouqi_us,uint16 high_us_A,uint16 high_us_B) { uint8 ckdiv = 1; //预分频 float tmp; if((float)zhouqi_us>(float)(65536/F_CPU_M)) { TCCR1B=CKDIV_8;//控制预分频 ckdiv = 8; } else { TCCR1B=CKDIV_1;//控制预分频 } tmp=F_CPU_M*(float)(zhouqi_us/ckdiv); ICR1 = (uint16)tmp; //控制最高计数 if(high_us_A) { DDR_OC1|=(1<<PORT_OC1A); //对应引脚为输出 TCCR1A |=(1<<COM1A1);   //比较匹配时清零 tmp=F_CPU_M*(float)(high_us_A/ckdiv); OCR1A=(uint16)tmp; } if(high_us_B) { DDR_OC1|=(1<<PORT_OC1B); TCCR1A |=(1<<COM1B1); tmp=F_CPU_M*(float)(high_us_B/ckdiv); OCR1B=(uint16)tmp; } TCCR1A |=(1<<WGM11); //WGM 11 12 13 组合表示 快速PWM模式 计数TOP 为ICR1 TCCR1B |=((1<<WGM13)|(1<<WGM12)); }

pwmIint_us(200,100,0);的效果如图

pwmIint_us(65000,32500,0); 的效果




上一篇: Windows操作系统25年发展历程
下一篇: 单片机自关机(彻底关机)电路的实现方法

发表评论