avr頻率佔空比可調波形輸出子函式

wsqyouth發表於2015-01-31
#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

相關文章