以下使用CH592X做驗證
CH59X系列相對於CH58X,CH57X系列的8位元系統PWM多了6路的16位元的PWM。
CH59X除了定時器提供的 4 路 26 位 PWM 輸出之外,系統還提供了 8 路 8 位 PWM 輸出(PWM4~PWM11)或 6 路 16 位 PWM 輸出(PWM4~PWM9),佔空比可調。
現在的PWMX例程中沒有16位元PWM的使用程式。
先看手冊中對16位元PWM的使用說明。
在使用是需要對PWMx 設定控制暫存器進行設定;
需要使用16位元的根據手冊提示程式中做如下設定即可:PWMX_CycleCfg(PWMX_Cycle_32);/PWMX_CycleCfg(PWMX_Cycle_31);
對應PWM通道根據現在支援的通道使用,下面以PWM4為例;現在提供的例程中沒有將封好16位元的PWM的API,現在使用的話參照8位元的PWM的使用即可;
下面是8位元的PWM使用的函數:
void PWMX_ACTOUT(uint8_t ch, uint8_t da, PWMX_PolarTypeDef pr, FunctionalState s) { uint8_t i; if(s == DISABLE) { R8_PWM_OUT_EN &= ~(ch); } else { (pr) ? (R8_PWM_POLAR |= (ch)) : (R8_PWM_POLAR &= ~(ch)); for(i = 0; i < 8; i++) { if((ch >> i) & 1) { *((volatile uint8_t *)((&R8_PWM4_DATA) + i)) = da; } } R8_PWM_OUT_EN |= (ch); } }
(Low_Level) ? (R8_PWM_POLAR |= (CH_PWM4)) : (R8_PWM_POLAR &= ~(CH_PWM4));
對比現有例程不免發現 佔空比與本函數有關*((volatile uint8_t *)((&R8_PWM4_DATA) + i)) = da;對於16位元的PWM根據手冊的描述程式需要做如下修改;
*((volatile uint32_t *)((&R32_PWM4_7_DATA) + i)
再結合時鐘週期計算公式,16位元PWM和8位元的時鐘週期數的選擇是不一樣的;16位元的時鐘週期計算是:RB_PWM_CYC_VALUE;在手冊中可以找到這個暫存器的說明:
佔空比計算:*((volatile uint32_t *)((&R32_PWM4_7_DATA) + i)) /R32_PWM_REG_CYCLE
具體使用設定如下:
PWMX_CLKCfg(1); PWMX_CycleCfg(PWMX_Cycle_32); { (Low_Level) ? (R8_PWM_POLAR |= (CH_PWM4)) : (R8_PWM_POLAR &= ~(CH_PWM4)); for(i = 0; i < 8; i++) { if((CH_PWM4 >> i) & 1) { *((volatile uint32_t *)((&R32_PWM4_7_DATA) + i)) = 3; } } R32_PWM_REG_CYCLE = 6; R8_PWM_OUT_EN |= (CH_PWM4); }
實測效果:
如有問題請指正。