<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

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

3天內不再提示

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

冬至子 ? 來源:小陳學不停 ? 作者:小陳學不停 ? 2023-07-21 16:17 ? 次閱讀

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< 
    TIM2- >CNT=0;
    TIM2- >CCR2 = (90*4-1); 
    TIM2- >CCMR1 = (TIM_OCMODE_INACTIVE< 
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);
    LED0 =!LED0;           
}

4.3 實測波形

圖片

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

    關注

    43

    文章

    828

    瀏覽量

    70677
  • 比較器
    +關注

    關注

    14

    文章

    1531

    瀏覽量

    106525
  • 預分頻器
    +關注

    關注

    0

    文章

    17

    瀏覽量

    8001
  • STM32F103ZET6
    +關注

    關注

    9

    文章

    67

    瀏覽量

    20828
  • stm32定時器
    +關注

    關注

    0

    文章

    13

    瀏覽量

    2269
收藏 人收藏

    評論

    相關推薦

    CubeMX如何配置定時器5用輸出比較作延時計時?

    輸出比較模式看了半天 沒明白 CUbeMX里不知道如何設置 才能實現 用比較匹配模式 產生中斷 ,不用產生PWM 現在用的是F2和F4
    發表于 04-23 07:10

    分享一下定時器的編程技巧

    分享一下定時器的編程技巧和編程實例的講解,每句都分析講解,方便初學者學習和進步
    發表于 09-28 11:16

    STM32定時器幾種模式介紹

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

    如何在比較模式對CCP定時器進行選擇?

    :CCPRxL寄存對的16位值與TMR1/3/5H:TMR1/3/5L寄存對的16位值進行比較。當匹配發生時,會發生以下事件之:·切換CCPx
    發表于 06-28 09:04

    請問一下怎樣正確的去設定定時器PWM的模式?

    定時器PWM的模式有哪幾種?怎樣正確的去設定定時器PWM的模式?定時器PWM的
    發表于 06-30 06:02

    單片機定時器實驗總結

    單片機定時器實驗總結,定時器中斷是單片機最重要的個功能,開始學的時候遇到了不少的問題,通過不斷地學習解決了不少問題,其實學會之后也沒有什
    發表于 07-14 06:58

    利用定時器B的比較功能輸出PWM波形

    思路:利用定時器B的比較功能輸出PWM波形;、定時器B定時器B的特點:1)異步16位
    發表于 11-29 06:52

    STM32通用定時器輸出比較功能

    STM32的通用定時器定時、輸出PWM功能的使用本次還是使用發光二極管來驗證定時器的使用目錄STM32的通用定時器
    發表于 12-01 06:30

    一下定時器的用法以及PWM的調速

    今天我們來講一下定時器的用法以及PWM的調速我們最初接觸的51單片機有兩組定時器(計數),因為既可以定時,又可以計數,因此叫做定時器(計數
    發表于 12-07 12:10

    STM32定時器的使用學習

    快速固定頻率采集數據的話建議學習一下定時器觸發數據通過DMA傳遞接下來可以學習一下定時器的使用了32常用的定時器功能有PWM波輸出,PWM波輸入判斷占空比和頻率,
    發表于 01-06 07:48

    關于定時器輸出比較模式中的電平理解

    關于定時器輸出比較模式中提到的有效電平、無效電平、高電平有效、低電平有效的理解。參考捕獲/比較通道的輸出
    發表于 01-06 06:34

    介紹一下定時器定時功能

    .定時器定時功能1.如圖打開cubemx配置定時器的預分頻系數和計數值![在這里插入圖片描述](?x-oss-process=image/watermark
    發表于 01-06 07:38

    定時器基礎知識與PWM輸出原理是什么

    轉速等。本篇先介紹定時器的基礎知識,然后對照這些知識介紹一下定時器輸出PWM的基本原理,以及編程實現與代碼分析。首先來看一下定時器的基礎介紹。1
    發表于 01-25 08:16

    51單片機定時器問題總結

    才勉強看懂,然后開始寫代碼,雖然寫成功了,但是我還是覺得有些懵懵懂懂的.于是我找了一些書還有開發板的幫助手冊看,總結一下。談談自己的看法定時器和中斷只學了一種模式
    發表于 11-23 16:51 ?2次下載
    51單片機<b class='flag-5'>定時器</b>問題<b class='flag-5'>總結</b>

    STM32定時器幾種輸出模式

    最近有接觸到通過可控硅的方式來控制交流風機或者電烙鐵功率,STM32的定時器輸出比較模式,剛好可以滿足這種需求,借此機會總結
    的頭像 發表于 01-12 16:49 ?4608次閱讀
    STM32<b class='flag-5'>定時器</b>的<b class='flag-5'>幾種</b><b class='flag-5'>輸出</b><b class='flag-5'>模式</b>
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>