nuvoton - PWM
PWM 的特性
- clock frequency up to 144MHz
- 16 bit resolution counter
- up counting mode
- down counting mode
- up/down counting mode
- 2 PWM modules
- Each module with 6 output channel
- Each module with 3 complementary pair
- Interrupt event
- Zero
- Period
- Compared value
- Brake condition happied
- Capture Timer function
- 12 capture input channels with 16 bit resolution
- rising / falling capture
- input rising / falling capture interrupt
- rising / falling capture with counter
- PDMA transfer for PWM all channels
Working mode
- independent mode architecture
- complementary mode architecture
Counter mode
Double buffering mode
- PERIOD, CMPDAT, 和 FTCMPDAT 是由開發者設計,但寫入並不會立刻啟動.
- PBUF, CMPBUF, 和 FTCMPBUF 硬體實際動作的值
- 當週期完成後,才會載入開發者寫入的新值.
- Counter loading mode
- period loading in up-count mode
- 預設的載入模式
- 當 PWM Counter 上數到 PERIOD 或者下數到 0 時,會啟動載入
- immediately loading
- PWM channel n 的 IMMLDENn (PWM_CTL0[21:16]) = 1
- 立刻載入, 當 PERIOD, CMPDAT and FTCMPDAT 被修改.
- 當 PWM Counter 的數值大於寫入的值,會立刻回到啟點.
- window loading
- PWM channel n 的 IMMLDENn (PWM_CTL0[13:8]) = 1
- 當週期結束, PERIOD 的載入就會啟動.
- CMPDAT 的載入需要 Load window 開啟, 並且計數結束.
- center loading
- PWM channel n 的 IMMLDENn (PWM_CTL0[5:0]) = 1
- 當週期結束, PERIOD 的載入就會啟動
- CMPDAT 的載入在計數到中心點時載入.
PWM Pulse generation
- PWM pulse generation 動作的條件
- Zero point event
- Period point event
- center point event (上數計數模式)
- PWM counter 符合 PWM compare value
- PWM pulse generation 的動作
- do nothing (X)
- set High (H)
- set Low (L)
- toggle (T)
PWM Output Mode
- 支援 2 種輸出模式
- Independent mode - 用於 DC motor system
- Complementary mode - 用於 AC induction motor and permanent magnets synchronous motor.
- Independent mode
- 預設模式
- Channel n 的 OUTMODEn (PWM_CTL1[26:24]) = 0
- PWM_CH0 - PWM_CH5 使用獨立的週期(period) 和 百分比(duty).
- Complementary mode
- Channel n 的 OUTMODEn (PWM_CTL1[26:24]) = 1
- PWM 的輸入變成一對, 例如 : PWM_CH1 是 PWM_CH0 的反向.
PWM Output Function
- 支援 2 種輸出功能
- Group function
- Synchronous function
- Group function
- GROUPEN (PWM_CTL0[24]) = 1
- 工作模式可以是 Independent 或 Complementary mode
- 範例 : 所有偶數 PWM channel 由 PWM_CH0 控制, 所有奇數 PWM channel 由 PWM_CH1 控制.
- Synchronous function
- 僅能工作在 Complementary mode
- 當接收到 SYNC 輸入訊號, PWM 輸出就會回到設定值(比較值), 再依計數方向上數或下數.
PWM Output Control
在 PWM pulse generation 之後, 由 PWM output control 來控制輸出訊號.輸出控制可分為數個階段如下:
- Independent mode
- Mask
- 用於 Electrically Commutated Motor (ECM) 的訊號控制
- PWM Mask Enable Control Register MSKENn(PWM_MSKEN[5:0]) 選擇那幾個 channel 輸出訊號會被 Mask 掉.
- PWM Masked Data Register MSKDATn(PWM_MSK[5:0]) 決定被 Mask PWM channel 的輸出是 High 還是 Low.
- Brake
- 支援兩個 external input 的 brake 功能
- Brake function flow
- edge detect brake source
- 產生 BRK_INT
- BRKLSTSn (PWM_INTSTS1[29:24]) = 1
- 當 brake 發生時, PWM 輸出保持為預設值
- software clear state
- Pin Polarity
- 使用 PWM Negative Polarity Control Register (PWM_POLCTL) 來設定輸出的極性.
- Output Enable
- Complementary mode
- Complementary channels
- Dead-Time Insertion
- 在 Complementary mode 可以使用 external 訊號來驗動, Dead-Time 的設計就如 de-boune 的功能一樣,檢測輸入訊號變化是否有持續 Dead-Time 以上,才會變更輸出訊號.
- Dead-Time 由程式設計者設定
- 啟動 channel n DTEN (PWM_DTCTLn[16]) =1
- 設定 Dead-Time 的長度於 DTCNT (PWM_DTCTLn[11:0])
PWM Interrupt generation
PWM 發生的中斷訊號有
- Zero point Interrupt Flag ZIFn (PWM_INTSTS0[5:0])
- Period point Interrupt Flag PIFn (PWM_INTSTS0[13:8])
- Different Interrupt
- 當 PWM counter 和 PWM_CMPDATn 的值相同時觸發.
- Up Interrupt Flag CMPUIFn (PWM_INTSTS0[21:16])
- 當 PWM counter 上數到 Up-counter 設定值
- Down Interrupt Flag CMPDIFn (PWM_INTSTS0[29:24])
- 當 PWM counter 下數到 Down-counter 設定值
PWM Code Flow
- Enable Clock of PWM module
CLK_EnableModuleClock(PWM1_MODULE);
CLK_SetModuleClock(PWM1_MODULE, CLK_CLKSEL2_PWM1SEL_PCLK1, 0);
/* Set PC9~PC11 multi-function pins for PWM1 Channel0~2 */
SYS->GPC_MFPH &= ~(SYS_GPC_MFPH_PC9MFP_Msk | SYS_GPC_MFPH_PC10MFP_Msk | SYS_GPC_MFPH_PC11MFP_Msk);
SYS->GPC_MFPH |= SYS_GPC_MFPH_PC9MFP_PWM1_CH0 | SYS_GPC_MFPH_PC10MFP_PWM1_CH1 | SYS_GPC_MFPH_PC11MFP_PWM1_CH2;
GPIO_SetMode(PC, BIT13, GPIO_MODE_INPUT);
SYS->GPC_MFPH &= ~SYS_GPC_MFPH_PC13MFP_Msk ;
SYS->GPC_MFPH |= SYS_GPC_MFPH_PC13MFP_PWM1_CH4;
/* Reset PWM1 channel 0~5 */
SYS_ResetModule(PWM1_RST);
void writePWMDAC(unsigned char Enable, unsigned char ch0_dut)
{
/* set PWMB channel 0 output configuration */
PWM_ConfigOutputChannel(PWM1, 4, 1000, ch0_dut);
// Start PWM COUNT
PWM_Start(PWM1, 1 << 4);
if(Enable == 0)
/* Enable PWM Output path for PWMB channel 0 */
PWM_DisableOutput(PWM1, 1 << 4);
else
/* Diable PWM Output path for PWMB channel 0 */
PWM_EnableOutput(PWM1, 1 << 4);
}
範例程式 :
在 FreeRTOS 中,加入一個定時啟動的 Task.在 Task 的初始化時,同時初始化 ADC 和 PWM,把 PWM 的輸出接到 ADC 的輸入。在定時啟動的部分,調整 PWM 的輸出再讀取 ADC 的值。
Reference document :
- nuvoton NuMicro-M451-Series-Training-Material
- nuvoton TRM_M451_Series_EN_Rev2.08
留言
張貼留言