首页 > 代码库 > avr频率占空比可调波形输出子函数

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

#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<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(0<<COM1B0)|(1<<WGM11)|(1<<WGM10);//WGM13:0 = 15,15模式: 比较匹配时OC1A 取反,OC1B 为低电平
 TCCR1B|=(1<<WGM13)|(1<<WGM12)|(1<<CS10);// 在这决定了1分频 0X19
 
 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<<COM1A1)|(0<<COM1A0)|(1<<COM1B1)|(0<<COM1B0)|(1<<WGM11)|(0<<WGM10);//WGM13:0 = 14,14模式: 比较匹配时OC1A 清零即为低电平,OC1B 为低电平
 TCCR1B|=(1<<WGM13)|(1<<WGM12)|(1<<CS10);// 在这决定了1分频 0X19
 
 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频率占空比可调波形输出子函数