×
单片机 > 单片机程序设计 > 详情

avr频率占空比可调波形输出子函数

发布时间:2020-06-04 发布时间:
|

#ifndef _KPWM_H_
#define _KPWM_H_
/*************avr频率占空比可调波形输出子函数**************/
///形参:Fclk赋值设定频率(单位为k)  范围:  1K 到 256K 
///      rat设定占空比(单位为百分比)eg:40 则输出方波占空比为百分之四十
//频率误差小于2%,占空比误差小于5%
//PWM频率计算公式为f=fox/N(1+TOP) fox为晶振频率 N为分频系数 TOP为计数计数最大值 
//TOP的反算公式为TOP=FOX/NFclk-1
//在15模式下计数最大值为OCR1A
//比较值放在OCR1B
//15模式下时钟1到达OCR1B时OC1B脚跳变
//而OC1A脚以两倍Fclk输出占空比为50%方波
//这里默认的晶振频率是12M的,实际得根据自己MCU修改
//
void KPWM(unsigned char fcq,unsigned char rat)
{
 unsigned int f,r;
 DDRD|=0X30;//设置PD4 PD5为第二功能脚 分别为OC1B OC1A 
 TCCR1A|=(0< TCCR1B|=(1< 
 f=12000/fcq;//计算最大值,因为输出单位为KHZ的方波,故12 000 000去除后面3个0
 f=f/1;
 f=f-1;
 r=f;
 r=r/10;  
 r=r*rat; //计算比较值,实质是除以100,防止溢出吧
 r=r/10;
 
 OCR1A=f;
 OCR1B=r;
}
void KPWM_MODE14(unsigned char fcq,unsigned char rat1,unsigned char rat2)
{
 unsigned int f,r1,r2;
 DDRD|=0X30;//设置PD4 PD5为第二功能脚 分别为OC1B OC1A 
 TCCR1A|=(1< TCCR1B|=(1< 
 f=12000/fcq;//计算最大值,因为输出单位为KHZ的方波,故12 000 000去除后面3个0
 f=f/1;
 f=f-1;
 r1=f;
 r1=r1/10;  
 r1=r1*rat1; //计算比较值,实质是除以100,防止溢出吧
 r1=r1/10;
 
 r2=f;
 r2=r2/10;  
 r2=r2*rat2; //计算比较值,实质是除以100,防止溢出吧
 r2=r2/10;
 ICR1=f;
 OCR1A=r1;
 OCR1B=r2; //此处方向自己决定吧,记得要验证
}
#endif



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式