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
#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
相關文章
- (DDS)正弦波形發生器——幅值、頻率、相位可調(二)
- STM32一個定時器輸出四路不同頻率和佔空比PWM波的方法定時器
- 常用輸入輸出函式函式
- 輸出輸入函式彙總函式
- ncurses輸出函式:字元+字串的輸出函式字元字串
- C++逐字輸出函式C++函式
- 機房空調比普通空調好在哪
- 《暖通空調與熱泵》:2023年格力中央空調市場佔有率穩居第一
- C語言_輸入輸出函式_PAGE5C語言函式
- 新手學python之Python的輸入輸出函式Python函式
- MATLAB自帶的函式tabulate統計一個陣列中各數字(元素)出現的頻數、頻率Matlab函式陣列
- 智慧家居如何把老款定頻空調變成智慧“變頻”空調#米家#智慧家居#HA
- cmp是可選的自定義比較函式函式
- 要點3:輸入函式對比與自定義輸入方式函式
- 利用css var函式讓你的元件樣式輸出規範樣式API,可定製性更高;CSS函式元件API
- thinkphp 輸出變數使用函式處理PHP變數函式
- Go 最直接的debug 方式 輸出函式Go函式
- 【MATLAB】利用size()函式輸出陣列大小Matlab函式陣列
- DRF-認證許可權頻率
- DRF之許可權和頻率限制
- 調查顯示77.2%受訪者坦言今年玩電子遊戲頻率增加遊戲
- 子函式呼叫函式
- 2.75V 至 6V 輸入、TPS62812MWRWYR、TPS62813MWRWYR 可調頻率降壓開關穩壓器
- 關於Tensorflow2.0 keras的子類式多輸入多輸出Keras
- php 可變函式PHP函式
- 【函式式 Swift】可選值函式Swift
- C語言——常用標準輸入輸出函式 scanf(), printf(), gets(), puts(), getchar(), putchar(); 字串拷貝函式 strcpy(), strncpy(), strchr(), strstr()函式用法特點C語言函式字串
- 最長迴文子序列(不連續) 可輸出迴文序列
- 函式呼叫與空間分配函式
- 空類裡有哪些函式函式
- MATLAB影像處理imadjust()函式調節影像的對比度示例Matlab函式
- 子父類中函式函式
- cpu頻率調節軟體:Turbo Boost Switcher Pro for macMac
- Tkinter (18) 可微調輸入部件 Spinbox
- excel 字元比較函式Excel字元函式
- 莫比烏斯函式函式
- ncurses輸入函式:字元+字串的輸入函式字元字串
- ES6函式比對ES5函式函式
- Oracle:SYS_REFCURSOR作為函式中的輸出引數Oracle函式