那曲檬骨新材料有限公司

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信號
    有钱人百家乐官网的玩法技巧和规则 | 百家乐统计软件| 盛大69棋牌游戏| 网上百家乐官网如何打水| 网络百家乐官网大转轮| 百家乐分析绿色版| 百家乐平台下载| 大发888娱乐游戏充值| 鲁甸县| 百家乐官网代理在线游戏可信吗网上哪家平台信誉好安全 | 百家乐官网娱乐城备用网址| 单机百家乐官网破解方法| 一直对百家乐很感兴趣.zibo太阳城娱乐城 | 全讯网1| 博彩通评价| 百家乐官网讲谈| 百家乐必胜下注法| 大发888问题缺少组件| 百家乐官网娱乐网站| 太阳城百家乐官网祖玛| 百家乐玩法开户彩公司| 单机棋牌游戏下载| 代理百家乐官网试玩| YY百家乐的玩法技巧和规则| 鸿博娱乐场| 百威百家乐官网的玩法技巧和规则 | 德州扑克玩法说明| 网络百家乐官网电脑| 太阳城代理最新网址| 揭秘百家乐官网百分之50| 博之道百家乐的玩法技巧和规则 | 首席百家乐的玩法技巧和规则| 宾利百家乐官网现金网| 帝王百家乐新足球平台| 顶级赌场dj| 澳门百家乐官网手机软件| 济州岛娱乐场cns| 诺贝尔百家乐官网的玩法技巧和规则 | 网络百家乐赚| 棋牌百家乐官网赢钱经验技巧评测网 | 爱博彩到天上人间|