吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

STM32定時器的幾種輸出模式

CHANBAEK ? 來源:小陳學不停 ? 作者:小陳學不停 ? 2023-01-12 16:49 ? 次閱讀

1 背景
最近有接觸到通過可控硅的方式來控制交流風機或者電烙鐵功率,STM32定時器輸出比較模式,剛好可以滿足這種需求,借此機會總結一下定時器的幾種輸出模式。

2 STM32的定時器比較輸出
STM32的定時器比較輸出一共有8種,記錄一下初始化方法和邏輯分析儀的波形。
在官網搜索對應的型號找到用戶手冊,比如STM32F103ZET6
找到比較模式相關配置的描述
TIMx capture/compare mode register 1 (TIMx_CCMR1)
Address offset: 0x18 Reset value: 0x0000
The channels can be used in input (capture mode) or in output (compare mode). The
direction of a channel is defined by configuring the corresponding CCxS bits. All the other
bits of this register have a different function in input and in output mode. For a given bit,
OCxx describes its function when the channel is configured in output, ICxx describes it
function when the channel is configured in input. Take care that the same bit can have a
different meaning for the input stage and for the output stage。

圖片圖片圖片

圖片

圖片

2.1 OCxM 輸出匹配模式
OC1M用于配置通道1,通道2則在OC2M上

2.1.1 TIM_OCMODE_TIMING
000:Frozen凍結模式
TIMx_CCR1和計數器TIMx_CNT之間的比較對輸出沒有影響

2.1.2 TIM_OCMODE_ACTIVE
001: Set channel 1 to active level on match。
匹配時將輸出為有效電平,當TIMx_CNT=TIMx_CCR1時強制輸出為高電平

2.1.3 TIM_OCMODE_INACTIVE
010: Set channel 1 to inactive level on match。
匹配時將輸出為無效電平,當TIMx_CNT=TIMx_CCR1時強制輸出為高低電平

2.1.4 TIM_OCMODE_TOGGLE
011: 當TIMx_CNT=TIMx_CCR1時電平翻轉。

2.1.5 TIM_OCMODE_FORCED_INACTIVE
100: Force inactive level,強制輸出為低電平(無效電平)

2.1.6 TIM_OCMODE_FORCED_ACTIVE
101: Force active level,強制輸出為高電平(有效電平)

2.1.7 TIM_OCMODE_PWM1
110: PWM mode 1
當TIMx_CNT

2.1.8 TIM_OCMODE_PWM2
111: PWM mode 2
當TIMx_CNT

3 實測波形
在上電時默認會有個100ms的高電平,作為一個直觀的起始信號
預分頻設置為(72000000/2000)-1,最大計數為415-1,則周期是(1*415/2000)=(0.207)s

3.1 TIM_OCMODE_TIMING
3.1.1初始化代碼

void TIM1_PWM_Init(u16 arr,u16 psc)
{
    htim2.Instance = TIM2;
    htim2.Init.Prescaler = psc;
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim2.Init.Period = arr;
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
    htim2.Init.RepetitionCounter = 0;
    HAL_TIM_OC_Init(&htim2);
    sConfigOC.OCMode = TIM_OCMODE_TIMING;;
    sConfigOC.Pulse = 0;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2);
    TIM_CCxChannelCmd(TIM2, TIM_CHANNEL_2, TIM_CCx_ENABLE);//
    HAL_TIM_Base_Start_IT(&htim2);
}

3.1.2 波形
極性是高電平時,上電后100ms后一直保持低電平

圖片

極性是低電平時,一直保持高電平

圖片

3.2 TIM_OCMODE_ACTIVE
3.2.1初始化代碼

void TIM1_PWM_Init(u16 arr,u16 psc)
{
    htim2.Instance = TIM2;
    htim2.Init.Prescaler = psc;
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim2.Init.Period = arr;
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
    htim2.Init.RepetitionCounter = 0;
    HAL_TIM_OC_Init(&htim2);
    sConfigOC.OCMode = TIM_OCMODE_ACTIVE;
    sConfigOC.Pulse = 0;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2);
    TIM_CCxChannelCmd(TIM2, TIM_CHANNEL_2, TIM_CCx_ENABLE);//
    HAL_TIM_Base_Start_IT(&htim2);
}

3.2.2 波形
極性是低電平時,會先輸出脈寬為計數周期的高電平,當TIMx_CNT=TIMx_CCR2后輸出一直為低電平(有效電平)

圖片

極性是高電平時,會先輸出脈寬為計數周期的低電平,當TIMx_CNT=TIMx_CCR2后輸出一直為高電平(有效電平)

圖片

3.3 TIM_OCMODE_INACTIVE
3.3.1初始化代碼

void TIM1_PWM_Init(u16 arr,u16 psc)
{
    htim2.Instance = TIM2;
    htim2.Init.Prescaler = psc;
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim2.Init.Period = arr;
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
    htim2.Init.RepetitionCounter = 0;
    HAL_TIM_OC_Init(&htim2);
    sConfigOC.OCMode = TIM_OCMODE_INACTIVE;
    sConfigOC.Pulse = 0;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2);
    TIM_CCxChannelCmd(TIM2, TIM_CHANNEL_2, TIM_CCx_ENABLE);//
    HAL_TIM_Base_Start_IT(&htim2);
}

3.3.2 波形
極性是低電平時,當TIMx_CNT=TIMx_CCR2時會出現一個低電平,但持續時間很短,然后一直輸出一個高電平(無效電平)

圖片

極性是高電平時,一直輸出為低電平(無效電平)

圖片

3.4 TIM_OCMODE_TOGGLE
3.4.1初始化代碼

void TIM1_PWM_Init(u16 arr,u16 psc)
{
    htim2.Instance = TIM2;
    htim2.Init.Prescaler = psc;
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim2.Init.Period = arr;
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
    htim2.Init.RepetitionCounter = 0;
    HAL_TIM_OC_Init(&htim2);
    sConfigOC.OCMode = TIM_OCMODE_TOGGLE;
    sConfigOC.Pulse = arr/2;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2);
    TIM_CCxChannelCmd(TIM2, TIM_CHANNEL_2, TIM_CCx_ENABLE);//
    HAL_TIM_Base_Start_IT(&htim2);
}

3.4.2 波形
極性是低電平時,會先輸出一個脈寬為半個計數周期的高電平,然后一直不停地翻轉出一個脈寬為一個計數周期的電平

圖片

極性是高電平時,會先輸出一個脈寬為半個計數周期的低電平,然后一直不停地翻轉出一個脈寬為一個計數周期的電平

圖片

3.5 TIM_OCMODE_PWM1
3.5.1初始化代碼

void TIM1_PWM_Init(u16 arr,u16 psc)
{
    htim2.Instance = TIM2;
    htim2.Init.Prescaler = psc;
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim2.Init.Period = arr;
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
    htim2.Init.RepetitionCounter = 0;
    HAL_TIM_OC_Init(&htim2);
    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = arr*2/3;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2);
    TIM_CCxChannelCmd(TIM2, TIM_CHANNEL_2, TIM_CCx_ENABLE);//
    HAL_TIM_Base_Start_IT(&htim2);
}

3.5.2 波形
極性是低電平時,當TIMx_CNT

圖片

極性是高電平時,當TIMx_CNT

圖片

3.6 TIM_OCMODE_PWM2
3.6.1初始化代碼

void TIM1_PWM_Init(u16 arr,u16 psc)
{
    htim2.Instance = TIM2;
    htim2.Init.Prescaler = psc;
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim2.Init.Period = arr;
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
    htim2.Init.RepetitionCounter = 0;
    HAL_TIM_OC_Init(&htim2);
    sConfigOC.OCMode = TIM_OCMODE_PWM2;
    sConfigOC.Pulse = arr*2/3;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2);
    TIM_CCxChannelCmd(TIM2, TIM_CHANNEL_2, TIM_CCx_ENABLE);//
    HAL_TIM_Base_Start_IT(&htim2);
}

3.6.2 波形
極性是低電平時,當TIMx_CNT

圖片

極性是高電平時,當TIMx_CNT

圖片

3.7 TIM_OCMODE_FORCED_ACTIVE
3.7.1初始化代碼

void TIM1_PWM_Init(u16 arr,u16 psc)
{
    htim2.Instance = TIM2;
    htim2.Init.Prescaler = psc;
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim2.Init.Period = arr;
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
    htim2.Init.RepetitionCounter = 0;
    HAL_TIM_OC_Init(&htim2);
    sConfigOC.OCMode = TIM_OCMODE_FORCED_ACTIVE;
    sConfigOC.Pulse = 0;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2);
    TIM_CCxChannelCmd(TIM2, TIM_CHANNEL_2, TIM_CCx_ENABLE);//
    HAL_TIM_Base_Start_IT(&htim2);
}

3.7.2 波形
極性是低電平時,一直輸出為低電平(有效電平)。

圖片

極性是高電平時,一直輸出為高電平(有效電平)。

圖片

3.8 TIM_OCMODE_FORCED_INACTIVE
3.8.1初始化代碼

void TIM1_PWM_Init(u16 arr,u16 psc)
{
    htim2.Instance = TIM2;
    htim2.Init.Prescaler = psc;
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim2.Init.Period = arr;
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
    htim2.Init.RepetitionCounter = 0;
    HAL_TIM_OC_Init(&htim2);
    sConfigOC.OCMode = TIM_OCMODE_FORCED_INACTIVE;
    sConfigOC.Pulse = 0;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2);
    TIM_CCxChannelCmd(TIM2, TIM_CHANNEL_2, TIM_CCx_ENABLE);//
    HAL_TIM_Base_Start_IT(&htim2);
}

3.8.2 波形
極性是低電平時,一直輸出為高電平(無效電平)。

圖片

極性是高電平時,一直輸出為低電平(無效電平)。

圖片

4 應用場景
假設可控硅是低電平導通,我們需要在初始化時輸出為高電平,在過零時輸出一個低電平,電平的時間可控。
4.1 初始化定時器為TIM_OCMODE_INACTIVE模式

void TIM1_PWM_Init(u16 arr,u16 psc)
{
    htim2.Instance = TIM2;
    htim2.Init.Prescaler = psc;
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim2.Init.Period = arr;
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
    htim2.Init.RepetitionCounter = 0;
    HAL_TIM_OC_Init(&htim2);
    sConfigOC.OCMode = TIM_OCMODE_INACTIVE;
    sConfigOC.Pulse = 0;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2);
    TIM_CCxChannelCmd(TIM2, TIM_CHANNEL_2, TIM_CCx_ENABLE);//
    HAL_TIM_Base_Start_IT(&htim2);
}

4.2 使用按鍵來模擬過零信號,平時輸出為高電平(無效電平),當按鍵按下時,強制輸出為低電平,并且脈寬為207.5*360/415=180ms,然后輸出持續為高電平(無效電平)

key = KEY_Scan(0);
if(key == KEY0_PRES) 
{
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);  
    TIM2->CCMR1 = (TIM_OCMODE_FORCED_ACTIVE<<8);    
    TIM2->CNT=0;
    TIM2->CCR2 = (90*4-1); 
    TIM2->CCMR1 = (TIM_OCMODE_INACTIVE<<8);  
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);
    LED0 =!LED0;           
}

4.3 實測波形

圖片

5 總結
在工作中需要學習很多新的東西,這就難免會有困惑,當我們束手無策的時候,我們可以借助一些工具,例如邏輯分析儀、示波器來看看數據到底是什么樣的,所有的算法都是基于數據來寫的,以實際數據為導向,結合理論與實踐,只有這樣我們才能真正的學到新的東西。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • STM32
    +關注

    關注

    2272

    文章

    10923

    瀏覽量

    357538
  • 輸出
    +關注

    關注

    0

    文章

    93

    瀏覽量

    21867
  • 定時器
    +關注

    關注

    23

    文章

    3255

    瀏覽量

    115362
  • 波形
    +關注

    關注

    3

    文章

    379

    瀏覽量

    31656
  • 高電平
    +關注

    關注

    6

    文章

    154

    瀏覽量

    21499
收藏 人收藏

    評論

    相關推薦

    STM32定時器(一)PWM輸出

    STM32定時器分類眾多,按照內核、外核標準分為兩部分:核內定時器+核外定時器
    的頭像 發表于 07-21 14:51 ?5053次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>定時器</b>(一)PWM<b class='flag-5'>輸出</b>

    總結一下定時器幾種輸出比較模式

    最近有接觸到通過可控硅的方式來控制交流風機或者電烙鐵功率,STM32定時器輸出比較模式,剛好可以滿足這種需求,借此機會總結一下定時器
    的頭像 發表于 07-21 16:17 ?3.6w次閱讀
    總結一下<b class='flag-5'>定時器</b>的<b class='flag-5'>幾種</b><b class='flag-5'>輸出</b>比較<b class='flag-5'>模式</b>

    STM32定時器幾種模式介紹

    32的定時器主要有 時基單元,比較輸出,輸入捕獲和PWM輸出幾種工作模式。其中時基單元和比較輸出
    發表于 07-06 08:02

    STM32F4定時器的計數模式有哪幾種

    STM32F4的定時器功能有哪些?STM32F4定時器的計數模式有哪
    發表于 11-23 06:09

    STM32定時器同步模式有哪幾種

    STM32定時器同步模式有哪幾種
    發表于 11-24 06:11

    stm32定時器中斷程序

    STM32定時器是個強大的模塊,定時器使用的頻率也是很高的,定時器可以做一些基本的定時,還可以做PWM
    發表于 10-12 16:59 ?1.3w次閱讀

    stm32定時器輸入捕獲

    系統滴答定時器一般用來提供心跳作用,而STM32定時器最基本功能也是定時,可以設置不同時間長度的定時
    發表于 10-13 09:13 ?2.4w次閱讀
    <b class='flag-5'>stm32</b><b class='flag-5'>定時器</b>輸入捕獲

    如何通過STM32定時器輸出PWM?

    ? 本文將介紹通過STM32定時器輸出PWM,如果對定時器不太熟悉的同學可以看下之前的文章《STM32基礎
    的頭像 發表于 02-20 15:08 ?2.2w次閱讀
    如何通過<b class='flag-5'>STM32</b>的<b class='flag-5'>定時器</b><b class='flag-5'>輸出</b>PWM?

    [STM32]通用定時器的使用

    STM32的通用定時器定時輸出PWM功能的使用本次還是使用發光二極管來驗證定時器的使用目錄STM32
    發表于 11-22 19:06 ?24次下載
    [<b class='flag-5'>STM32</b>]通用<b class='flag-5'>定時器</b>的使用

    STM32定時器-基本定時器

    目錄定時器分類基本定時器功能框圖講解基本定時器功能時鐘源計數時鐘計數自動重裝載寄存
    發表于 11-23 18:21 ?31次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>定時器</b>-基本<b class='flag-5'>定時器</b>

    STM32——高級定時器、通用定時器、基本定時器的區別

    STM32——高級定時器、通用定時器、基本定時器的區別
    發表于 11-26 15:21 ?110次下載
    <b class='flag-5'>STM32</b>——高級<b class='flag-5'>定時器</b>、通用<b class='flag-5'>定時器</b>、基本<b class='flag-5'>定時器</b>的區別

    STM32-通用定時器-PWM輸出

    捕獲、輸出比較、PWM輸出、單脈沖模式輸出等。STM32定時器除了TIM6和TIM7(基本
    發表于 11-26 15:36 ?23次下載
    <b class='flag-5'>STM32</b>-通用<b class='flag-5'>定時器</b>-PWM<b class='flag-5'>輸出</b>

    STM32-通用定時器-定時器中斷

    )。他們之間的區別情況見下表: 定時器種類 位數 計數模式 產生DMA請求 捕獲/比較通道 互補輸出
    發表于 11-26 15:36 ?16次下載
    <b class='flag-5'>STM32</b>-通用<b class='flag-5'>定時器</b>-<b class='flag-5'>定時器</b>中斷

    STM32定時器單脈沖輸出模式

    STM32定時器單脈沖輸出模式
    發表于 12-08 20:51 ?48次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>定時器</b>單脈沖<b class='flag-5'>輸出</b><b class='flag-5'>模式</b>

    STM32F103-定時器編碼模式和高級定時器輸出互補的PWM信號

    STM32F103-定時器編碼模式和高級定時器輸出互補的PWM信號剛使用
    發表于 01-14 12:53 ?11次下載
    <b class='flag-5'>STM32</b>F103-<b class='flag-5'>定時器</b>編碼<b class='flag-5'>器</b><b class='flag-5'>模式</b>和高級<b class='flag-5'>定時器</b><b class='flag-5'>輸出</b>互補的PWM信號
    百家乐赌博策略论坛| 威尼斯人娱乐场 澳门| 百家乐官网真钱路怎么看| 大发888官方zhuce| 做生意风水 门对门| 壹贰博网| ag百家乐下载| 新世纪百家乐官网的玩法技巧和规则 | 做生意店铺缺西北角| 高额德州扑克视频| 巴黎百家乐地址| 太阳城百家乐官网外挂| 大发888娱乐城健账号| 杨筠松 24山 土| 百家乐官网路单破解方法| ewin娱乐城官方下载| 百家乐博娱乐网赌百家乐的玩法技巧和规则| 博彩百家乐官网网址| 大发888娱乐下载网址| 网上的百家乐是假的吗| 百家乐几点开奖| 百家乐官网一邱大师打法| 太子娱乐城官网| 赌博游戏网站| 全讯网报码| 大发888bjl| 大发888娱 太阳城| 反赌百家乐官网的玩法技巧和规则| 百家乐官网是否有规律| 娱乐城金赞| 威尼斯人娱乐城是骗子| 百家乐的巧门| 环球百家乐的玩法技巧和规则| 百家乐网络赌博地址| 江山百家乐官网的玩法技巧和规则| 真钱百家乐官网游戏大全| 百家乐官网3带厂家地址| 百家乐官网免费破解外挂| 网上百家乐官网官方网站| 澳门赌百家乐官网能赢钱吗| 真人百家乐官网在线玩|