通信電纜 網絡設備 無線通信 云計算|大數據 顯示設備 存儲設備 網絡輔助設備 信號傳輸處理 多媒體設備 廣播系統 智慧城市管理系統 其它智慧基建產品
沈陽芯碩科技有限公司
顏色 | 黑色 |
---|
華大單片機可以通過種方式進行PWM輸出,工程師反應使用高級定時器輸出PWM的時候,不能輸出占空比為0或100的波形。這時由于高級定時器輸出PWM時設置會比較特殊,下面進行相關的介紹。
華大單片機可以通過種方式進行PWM輸出,工程師反應使用高級定時器輸出PWM的時候,不能輸出占空比為0或100的波形。這時由于高級定時器輸出PWM時設置會比較特殊,下面進行相關的介紹。
高級定時器進行PWM輸出時,波形主要由下面幾個寄存器的值來決定:
PCONR.PERCx(x=A/B) : CHA和CHB的周期匹配時,輸出電平狀態,設置的是PWM周期結束后電平狀態;
PCONR.CMPCx(x=A/B): CHA和CHB的比較匹配時,輸出電平狀態,設置的是計數到計數點后電平的狀態;
PCONR.STASTPSx(x=A/B):CHA和CHB的起始和停止電平選擇;
PCONR.STACx(x=A/B): 計數開始時CHA和CHB電平狀態,PWM開始前端口的電平狀態;
PCONR.STPCx(x=A/B):計數結束時CHA和CHB電平狀態,PWM停止后端口的電平狀態;
前兩個寄存器用來設置PWM輸出周期的波形,后三個寄存器用來設置PWM開始和結束時端口的電平。
本文開頭提到的問題通過設置前兩個寄存器就可以實現。下面以起始低電平,計數匹配后高電平的PWM波形來說明。起始低電平說明PWM周期匹配后,新的周期開始時端口的電平為低電平,需要把PCONR.PERCx設置為低電平;計數匹配后為高電平,把PCONR.CMPCx設置為高電平就可以。這樣的設置可以輸出0~(<100)占空比的波形。100這點需要始終是高電平,也就是說周期匹配的時候不能輸出低電平,設置為低電平的話,當周期匹配的時候會立刻輸出一個低電平,再進行比較匹配的判斷,匹配分輸出高電平,這樣就存在一個很小的低電平脈沖,不是我們所需要的。
當要輸出100占空比的時候,要把PCONR.PERCx設置為高電平,這樣就周期匹配的時候會輸出高電平,不會再有低電平脈沖。當占空比不是100的時候,再把PCONR.PERCx設置回低電平就可以。
以華大單片機HC32F003芯片TIM4定時器CHA通道為例,每一秒改變增加10%占空比,輸出100后,占空比改為0輸出。代碼部分如下:
int32_t main(void)
{
float fPwmDyty = 0.0;
en_adt_unit_t enAdt;
uint16_t u16Period;
en_adt_compare_t enAdtCompare;
uint16_t u16Compare;
stc_adt_basecnt_cfg_t stcAdtBaseCntCfg;
stc_adt_CHxX_port_cfg_t stcAdtTIM4ACfg;
DDL_ZERO_STRUCT(stcAdtBaseCntCfg);
DDL_ZERO_STRUCT(stcAdtTIM4ACfg);
Clk_SetPeripheralGate(ClkPeripheralGpio, TRUE); //端口外設時鐘使能
Gpio_SetFunc_TIM4_CHA_P23();
Clk_SetPeripheralGate(ClkPeripheralAdt, TRUE); //ADT外設時鐘使能
enAdt = AdTIM4;
Adt_StopCount(enAdt);
Adt_ClearCount(enAdt);
stcAdtBaseCntCfg.enCntMode = AdtSawtoothMode; //ADT載波為三角波
stcAdtBaseCntCfg.enCntDir = AdtCntUp; //向上計數
stcAdtBaseCntCfg.enCntClkDiv = AdtClkPClk0Div8; //PCLK8分頻
Adt_Init(enAdt, &stcAdtBaseCntCfg); //ADT載波、計數模式、時鐘配置
u16Period = 0xEEEE;
Adt_SetPeriod(enAdt, u16Period); //設置PWM周期
enAdtCompare = AdtCompareA;
u16Compare = 0xEEEE;
Adt_SetCompareValue(enAdt, enAdtCompare, u16Compare); //設置CHA通道PWM低電平時間
enAdtCompare = AdtCompareC;
u16Compare = 0xEEEE;
Adt_SetCompareValue(enAdt, enAdtCompare, u16Compare); //設置CHA通道比較緩存值
Adt_EnableValueBuf(enAdt, AdtCHxA, TRUE); //使能CHA通道緩存輸出
stcAdtTIM4ACfg.enCap = AdtCHxCompareOutput; //比較輸出
stcAdtTIM4ACfg.bOutEn = TRUE; //端口輸出使能
stcAdtTIM4ACfg.enPerc = AdtCHxPeriodLow; //周期匹配時輸出低電平
stcAdtTIM4ACfg.enCmpc = AdtCHxCompareHigh; //比較匹配時輸出高電平
stcAdtTIM4ACfg.enStaStp = AdtCHxStateSelSS; //計數開始或停止時,CHA端口輸出由STACB、STPCB決定
stcAdtTIM4ACfg.enStaOut = AdtCHxPortOutLow; //計數開始時CHA端口輸出設定為低電平
stcAdtTIM4ACfg.enStpOut = AdtCHxPortOutLow; //計數停止時CHA端口輸出設定為低電平
Adt_CHxXPortConfig(enAdt, AdtCHxA, &stcAdtTIM4ACfg); //端口CHA配置
Adt_StartCount(enAdt); //開啟ADT
while(1)
{
delay1ms(1000);
if(fPwmDyty < 1) //占空比小于100,將占空比加10%
{
fPwmDyty += 0.1;
}
else //占空比大于等于100,將占空比設置為0%
{
fPwmDyty = 0;
}
if (fPwmDyty < 1) //占空比小于100,將計數周期結束時輸出設置為低
{
M0P_ADT0->PCONR_f.PERCA = 0;
}
else //占空比大于等于100,將計數周期結束時輸出設置為高
{
M0P_ADT0->PCONR_f.PERCA = 1;
}
Adt_SetCompareValue(AdTIM4, AdtCompareC, (1-fPwmDyty)*u16Period);
}
}
您感興趣的產品PRODUCTS YOU ARE INTERESTED IN
智慧城市網 設計制作,未經允許翻錄必究 .? ? ?
請輸入賬號
請輸入密碼
請輸驗證碼
請輸入你感興趣的產品
請簡單描述您的需求
請選擇省份