#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