stm32定時(shí)器之Output Compare
stm32f103vb發(fā)出邏輯信號給MOC3020,控制BTA16可控硅的通斷。
在檢測到過零信號時(shí),延時(shí)x毫秒,輸出1;延時(shí)y毫秒,關(guān)閉輸出。 實(shí)現(xiàn)相位控制調(diào)速感應(yīng)電機(jī)(小功率)。
在stm32 discovery開發(fā)板上,使用藍(lán)燈和綠燈模擬。
采用定時(shí)器的OC,比較輸出來做。
選用VBT6的一個(gè)Timer來做,它有4個(gè)通道可以使用,可以拿來控制4路可控硅輸出。
使用CubeMX做外設(shè)配置。
針腳配置:
這樣不把輸出直接發(fā)送到Pin上。 能直接發(fā)送到Pin上,使用One Pulse Mode 比較方便。 受限于委托公司的設(shè)計(jì)限制,沒法使用脈沖模式。
注意Prescaler的值, 值 = 時(shí)鐘頻率/1000 - 1, 及為1ms.
Pulse 值,表示計(jì)數(shù)器到達(dá)多少時(shí),做輸出,觸發(fā)中斷。
中斷需要啟用。
使用按鍵來觸發(fā)定時(shí)器,啟用兩個(gè)通道,這里簡單使用延時(shí)來按鍵消抖,可以使用狀態(tài)機(jī)處理:
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_SET){
HAL_Delay(20);
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_SET){
//strattimer
__HAL_TIM_SET_COUNTER(&htim2,0);//設(shè)置0
HAL_TIM_OC_Start_IT(&htim2,TIM_CHANNEL_1);
HAL_TIM_OC_Start_IT(&htim2,TIM_CHANNEL_2);
}
}
定義兩個(gè)flag:
__IOuint8_ton_led_blue=0;
__IOuint8_ton_led_green=0;
在回調(diào)函數(shù)處理:
voidHAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef*htim)
{
if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1)
{
if(!on_led_blue){
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);
on_led_blue=1;
HAL_TIM_OC_Stop_IT(&htim2,TIM_CHANNEL_1);
//設(shè)置新的時(shí)間
uint16_tdelay_new=__HAL_TIM_GET_COMPARE(&htim2,TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,delay_new+1999);
HAL_TIM_OC_Start_IT(&htim2,TIM_CHANNEL_1);
}
elseif(on_led_blue){
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);
on_led_blue=0;
HAL_TIM_OC_Stop_IT(&htim2,TIM_CHANNEL_1);
}
}
if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_2)
{
if(!on_led_green){
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET);#define__HAL_TIM_SET_COMPARE(__HANDLE__,
__CHANNEL__,
__COMPARE__
)
on_led_green=1;
HAL_TIM_OC_Stop_IT(&htim2,TIM_CHANNEL_2);
//設(shè)置新的時(shí)間
uint16_tdelay_new=__HAL_TIM_GET_COUNTER(&htim2,TIM_CHANNEL_2);
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,delay_new+1999);
HAL_TIM_OC_Start_IT(&htim2,TIM_CHANNEL_2);
}
elseif(on_led_green){
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET);
on_led_green=0;
HAL_TIM_OC_Stop_IT(&htim2,TIM_CHANNEL_2);
}
}
}
使用flag來區(qū)別HAL_TIM_ActiveChannel是 delay_on,還是delay_off。
#define __HAL_TIM_SET_COMPARE ( __HANDLE__,
__CHANNEL__,
__COMPARE__
)
這個(gè)宏可以方便的Sets the TIM Capture Compare Register value on runtime without calling another time ConfigChannel function.
效果表現(xiàn)為:
按鍵按下,藍(lán)燈3秒亮,2秒后滅;綠燈5秒后亮,2秒后滅。
總之,使用Timer的輸出Pin接Moc3020,脈沖方式是最省事省心的做法。
而其他Pin的話,只能這里使用一個(gè)替代的方法來實(shí)現(xiàn)。