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
相關文章
- STM32一個定時器輸出四路不同頻率和佔空比PWM波的方法定時器
- 使用頻率比較高的PHP函式方法PHP函式
- ncurses輸出函式:字元+字串的輸出函式字元字串
- 輸出輸入函式彙總函式
- C++逐字輸出函式C++函式
- js如何降低事件處理函式的執行頻率JS事件函式
- matlab中用於統計矩陣資料頻率,出現次數的函式Matlab矩陣函式
- C語言printf()函式:格式化輸出函式C語言函式
- MATLAB自帶的函式tabulate統計一個陣列中各數字(元素)出現的頻數、頻率Matlab函式陣列
- 調查顯示77.2%受訪者坦言今年玩電子遊戲頻率增加遊戲
- 變頻空調和定頻空調的區別有哪些 有何不同
- cmp是可選的自定義比較函式函式
- 要點3:輸入函式對比與自定義輸入方式函式
- 利用css var函式讓你的元件樣式輸出規範樣式API,可定製性更高;CSS函式元件API
- thinkphp 輸出變數使用函式處理PHP變數函式
- 子函式呼叫函式
- 新手學python之Python的輸入輸出函式Python函式
- C中的基本輸入輸出函式(Android之JNI)函式Android
- 關於友元函式過載輸入輸出運算子函式
- 【MATLAB】利用size()函式輸出陣列大小Matlab函式陣列
- Go 最直接的debug 方式 輸出函式Go函式
- 一些常用的NLTK頻率分佈類中定義的函式函式
- matlab統計 頻數、頻率和累積頻率Matlab
- cpu頻率調節軟體:Turbo Boost Switcher Pro for macMac
- Oracle可傳輸表空間測試Oracle
- 5.7 mysql的可傳輸表空間MySql
- 【SQL】使用分析函式與關聯子查詢的比較SQL函式
- Python print函式用法,print 格式化輸出Python函式
- php 可變函式PHP函式
- PHP函式,引數,可變參函式.PHP函式
- 出現頻率最高的筆試題 (轉)筆試
- 【函式式 Swift】可選值函式Swift
- 重定向子程式標準輸入輸出
- CPU主頻,倍頻,外頻,系統匯流排頻率,前端匯流排頻率前端
- oracle可傳輸表空間TTS小結OracleTTS
- 子父類中函式函式
- WINDOWS鉤子函式(轉)Windows函式
- VC:滑鼠鉤子函式函式