0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于STM32芯片三路互補(bǔ)PWM輸出的設(shè)計(jì)實(shí)現(xiàn)

冬至子 ? 來(lái)源:兔子問(wèn)烏龜 ? 作者:Mr Ma ? 2023-07-21 16:26 ? 次閱讀

硬件:Stm32f103c8t6最小系統(tǒng)。

開(kāi)發(fā)平臺(tái):MDK-Arm。

目的:使用Stm32高級(jí)定時(shí)器TIM1。配置中心對(duì)齊模式輸出三路互補(bǔ)PWM。

(1)Stm32的高級(jí)定時(shí)器:

Stm32f103c8t6有一個(gè)高級(jí)定時(shí)器TIM1。STM32的高級(jí)定時(shí)器比通用定時(shí)器增加了可編程死區(qū)互補(bǔ)輸出,重復(fù)計(jì)數(shù)器,帶剎車(短路)功能。這些功能為電機(jī)控制提供了便利。其中重復(fù)計(jì)數(shù)器下篇文章單獨(dú)講。

TIM1的IO分配:

1.jpg

2)高級(jí)定時(shí)器框圖分析:

圖片

圖1

圖1高級(jí)定時(shí)器框圖,可分為6部分,①時(shí)鐘源選擇,②控制器,③時(shí)基單元,④輸入捕獲,⑤輸出比較,⑥剎車斷路。

①時(shí)鐘選擇:

時(shí)鐘源有:內(nèi)部時(shí)鐘(CK_INT),外部時(shí)鐘模式1,外部時(shí)鐘模式2,內(nèi)部觸發(fā)輸入(ITRx)。具體可以看TIMx_SMCR寄存器SMS位和ECE位這里我們使用內(nèi)部時(shí)鐘64MHz(沒(méi)使用外部晶振,系統(tǒng)時(shí)鐘是64MHz)。

②控制器

控制器部分包含觸發(fā)控制器,從模式控制器,編碼器接口。觸發(fā)控制器可以為片內(nèi)外設(shè)提供觸發(fā)信號(hào)。

③⑤時(shí)基單元和輸出比較

時(shí)基單元的計(jì)數(shù)模式選中心對(duì)齊模式和比較輸出的比較模式選PWM模式來(lái)講解。

首先時(shí)鐘源通過(guò)預(yù)分頻寄存器PSC分頻得到CK_CNT,得到計(jì)數(shù)器CNT計(jì)數(shù)頻率,計(jì)數(shù)器開(kāi)始從0向上計(jì)數(shù),每計(jì)一次,和CCR比較一次,當(dāng)CRR>CNT, 輸出高電平,反之輸出低電平,計(jì)數(shù)器CNT繼續(xù)計(jì)數(shù),當(dāng)計(jì)數(shù)器等于ARR值時(shí),計(jì)數(shù)器向下計(jì)數(shù),當(dāng)計(jì)數(shù)器CNT>CCR時(shí),輸出低電平,反之輸出高電平。計(jì)數(shù)器周而復(fù)始向上向下計(jì)數(shù)并不斷的和CRR值比較,參考圖2。

圖片

圖2

實(shí)際此過(guò)程我們可以看成一個(gè)比較器,CRR作為參考電壓,接到比較器同相輸入端,CNT作為信號(hào)電壓,接到比較器反相輸入端,這樣根據(jù)比較輸出PWM。反之把CNT和CRR調(diào)換位置,會(huì)輸出相反極性的PWM,參考圖2.

計(jì)數(shù)器計(jì)數(shù)模式有:向上計(jì)數(shù),向下計(jì)數(shù),中心對(duì)齊計(jì)數(shù)。

比較輸出比較模式:凍結(jié),匹配時(shí)設(shè)置通道x為有效電平,匹配時(shí)設(shè)置通道x為無(wú)效電平,翻轉(zhuǎn),強(qiáng)制為無(wú)效電平,強(qiáng)制為有效電平,PWM1,PWM2。

死區(qū)發(fā)生器:

通過(guò)寄存器BDTR的位UTG[7:0]來(lái)配置死區(qū)時(shí)間,關(guān)于死區(qū)時(shí)間設(shè)置可以這篇文章:

⑥短路功能

斷路功能用于電控的剎車功能,可以通過(guò)寄存器BDTR的BKE位使能斷路功能,BKP位設(shè)置斷路輸入引腳的有效電平

④輸入捕獲

輸入捕獲可以對(duì)輸入的信號(hào)的上升沿,下降沿或者雙邊沿進(jìn)行捕獲,常用的有測(cè)量輸 入信號(hào)的脈寬和測(cè)量 PWM 輸入信號(hào)的頻率和占空比這兩種。

輸入捕獲的大概的原理就是,當(dāng)捕獲到信號(hào)的跳變沿的時(shí)候,把計(jì)數(shù)器 CNT 的值鎖存 到捕獲寄存器 CCR 中,把前后兩次捕獲到的 CCR 寄存器中的值相減,就可以算出脈寬或者頻率。如果捕獲的脈寬的時(shí)間長(zhǎng)度超過(guò)你的捕獲定時(shí)器的周期,就會(huì)發(fā)生溢出,這個(gè)我 們需要做額外的處理。

(3)程序設(shè)計(jì)

程序使用ST官方固件庫(kù),編程步驟:

①GPIO初始化;

②時(shí)基結(jié)構(gòu)體TIM_TimeBaseInitTypeDef 初始化;

③比較結(jié)構(gòu)體 TIM_OCInitTypeDef 初始化;

④剎車和死區(qū)結(jié)構(gòu)體 TIM_BDTRInitTypeDef 初始化。

程序分析:

①宏定義:

#define   RCC_TIMGPIO_CLK      RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB
#define   TIM_CHxGPIO_Pinx     GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11
#define   TIM_CHxGPIOx         GPIOA
#define   TIM_CHxNGPIO_Pinx    GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15
#define   TIM_CHxNGPIOx        GPIOB
#define   TIM_BKINGPIO_Pinx    GPIO_Pin_2
#define   TIM_BKINGPIOx        GPIOB

//TIM1 macro definition

/ PWM頻率和死區(qū)時(shí)間計(jì)算 */

//電機(jī)控制載波頻率一般配置在15-20KHz,頻率配置低了電機(jī)噪聲大,配置高了,對(duì)MOS

//管開(kāi)關(guān)頻率要求高,且開(kāi)關(guān)損耗大,這里載波配置為20KHz。

//計(jì)數(shù)器頻率計(jì)算CK_CNT = 64MHz/(PSC+1) = 64MHz/1=64MHz

//中心對(duì)齊PWM頻率=CK_INT/2(ARR+1)=64M/2(1599+1)=20KHz。

//死區(qū)時(shí)間配置為2us

//64M/(CKD+1)/ UTG = 500KHz,換算成時(shí)間位2us

// TIMx_CR1寄存器CKD 位,TIMx_BDTR寄存器UTG位。

#define   TIMx                 TIM1
#define   RCC_TIM_CLK          RCC_APB2Periph_TIM1
#define   TIM_ARR              1599
#define   TIM_CK_PSC           0
#define   TIM_RCR              0
#define   TIM_CCRx             799
#define   PWM_DeadTime         128

②GPIO初始化:

static void GPIO_TIM_Config(void){
   GPIO_InitTypeDef GPIO_InitStructure;
   RCC_APB2PeriphClockCmd(RCC_TIMGPIO_CLK, ENABLE);
   //TIM1_PA8CH1 PA9CH2 PA10CH3 PA11CH4
   GPIO_InitStructure.GPIO_Pin =  TIM_CHxGPIO_Pinx;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOA, &GPIO_InitStructure);
   //PB13CH1N PB14CH2N PB15CH3N PB12BKIN      
   GPIO_InitStructure.GPIO_Pin =  TIM_CHxNGPIO_Pinx; 
   GPIO_Init(TIM_CHxNGPIOx, &GPIO_InitStructure);      
   //PB12BKIN
   GPIO_InitStructure.GPIO_Pin =  TIM_BKINGPIO_Pinx; 
   GPIO_Init(TIM_BKINGPIOx, &GPIO_InitStructure);          
   GPIO_ResetBits(TIM_BKINGPIOx,TIM_BKINGPIO_Pinx);//剎車
}

③定時(shí)器時(shí)基單元,輸出比較,剎車死區(qū)初始化:

static void AdvanceTIM1_Config(void){
  //開(kāi)啟定時(shí)器時(shí)鐘,即內(nèi)部時(shí)鐘CK_INT=64MHz
  RCC_APB2PeriphClockCmd(RCC_TIM_CLK,ENABLE);
/*--------------------時(shí)基結(jié)構(gòu)體初始化-------------------------*/
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;     
  TIM_TimeBaseStructure.TIM_Period = TIM_ARR;   //自動(dòng)重裝載寄存器的值,累計(jì)TIM_Period+1個(gè)頻率后產(chǎn)生一個(gè)更新或者中斷      
  TIM_TimeBaseStructure.TIM_Prescaler = TIM_CK_PSC;   //驅(qū)動(dòng)CNT計(jì)數(shù)器的時(shí)鐘 = Fck_int/(psc+1)
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;  //時(shí)鐘分頻因子 ,配置死區(qū)時(shí)間時(shí)需要用到             
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1; //中心對(duì)齊1             
  TIM_TimeBaseStructure.TIM_RepetitionCounter = TIM_RCR;  //重復(fù)計(jì)數(shù)器的值,沒(méi)用到不用管      
  TIM_TimeBaseInit(TIMx, &TIM_TimeBaseStructure);  //初始化定時(shí)器
/*--------------------輸出比較結(jié)構(gòu)體初始化-------------------*/             
  TIM_OCInitTypeDef  TIM_OCInitStructure;     
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                //PWM1模式
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;    //輸出使能
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;  //互補(bǔ)輸出使能       
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;        //輸出通道電平極性配置
  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;      //互補(bǔ)輸出通道電平極性配置
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;       //輸出通道空閑電平極性配置
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;   //互補(bǔ)輸出通道空閑電平極性配置                  
  TIM_OCInitStructure.TIM_Pulse = TIM_CCRx;                        //設(shè)置占空比大小    
  TIM_OC1Init(TIMx, &TIM_OCInitStructure);
  TIM_OC1PreloadConfig(TIMx, TIM_OCPreload_Enable);
  TIM_OC2Init(TIMx, &TIM_OCInitStructure);
  TIM_OC2PreloadConfig(TIMx, TIM_OCPreload_Enable); 
  TIM_OC3Init(TIMx, &TIM_OCInitStructure);
  TIM_OC3PreloadConfig(TIMx, TIM_OCPreload_Enable);               
/*-------------------剎車和死區(qū)結(jié)構(gòu)體初始化-------------------*/
  //有關(guān)剎車和死區(qū)結(jié)構(gòu)體的成員具體可參考BDTR寄存器的描述
  TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
  TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
  TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
  TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
  //輸出比較信號(hào)死區(qū)時(shí)間配置,具體如何計(jì)算可參考 BDTR:UTG[7:0]的描述
  //這里配置的死區(qū)時(shí)間為2uS
  TIM_BDTRInitStructure.TIM_DeadTime = 128;
  TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;
  //當(dāng)BKIN引腳檢測(cè)到高電平的時(shí)候,輸出比較信號(hào)被禁止,就好像是剎車一樣
  TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
  TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
  TIM_BDTRConfig(TIMx, &TIM_BDTRInitStructure);
  TIM_Cmd(TIMx, ENABLE);      
  //主輸出使能,當(dāng)使用的是通用定時(shí)器時(shí),這句不需要
  TIM_CtrlPWMOutputs(TIMx, ENABLE);                  
}

4)程序燒錄驗(yàn)證:圖3是一對(duì)PWM互補(bǔ)輸出波形。

圖片

圖3

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 電機(jī)控制
    +關(guān)注

    關(guān)注

    3534

    文章

    1879

    瀏覽量

    268817
  • PWM波
    +關(guān)注

    關(guān)注

    0

    文章

    99

    瀏覽量

    16857
  • 預(yù)分頻器
    +關(guān)注

    關(guān)注

    0

    文章

    18

    瀏覽量

    8135
  • STM32F103C8T6
    +關(guān)注

    關(guān)注

    108

    文章

    160

    瀏覽量

    83573
  • stm32定時(shí)器
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

    2294
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32CubeIDE下配置STM32F103輸出帶死區(qū)的互補(bǔ)PWM

    STM32F103的TIM1和TIM8是高級(jí)定時(shí)器,可以產(chǎn)生嵌入死區(qū)時(shí)間的互補(bǔ)PWM波,使用STM32CubeIDE完成相關(guān)配置,可以直接生成代碼,
    的頭像 發(fā)表于 11-01 09:41 ?7577次閱讀
    <b class='flag-5'>STM32</b>CubeIDE下配置<b class='flag-5'>STM32</b>F103<b class='flag-5'>輸出</b>帶死區(qū)的<b class='flag-5'>互補(bǔ)</b><b class='flag-5'>PWM</b>波

    STM32F429的TIM4定時(shí)器輸出PWM,為什么第四PB9一直輸出低電平?

    芯片型號(hào):STM32F429ZGT6 用TIM4輸出4PWM,用的是PB6PB7PB8PB9程序是一樣的配置,前
    發(fā)表于 04-03 07:43

    TC387 MCAL如何配置互補(bǔ)PWM

    請(qǐng)問(wèn)有用MCAL配過(guò)三路互補(bǔ)PWM輸出嗎?研究了好幾天了,沒(méi)找到MCAL配置互補(bǔ)PWM的地方
    發(fā)表于 07-03 07:20

    請(qǐng)問(wèn)一輸入控制三路輸出,怎么實(shí)現(xiàn)

    請(qǐng)問(wèn)一輸入高電平時(shí),三路輸出也是高電平,它們之間不能互相影響,怎么實(shí)現(xiàn)
    發(fā)表于 08-04 23:24

    關(guān)于STM32PWM輸出的問(wèn)題

    想利用stm32的tim3的個(gè)通道輸出三路pwm,頻率相互獨(dú)立,分別控制個(gè)電機(jī)。還想控制每一
    發(fā)表于 05-07 17:40

    ADUC7020產(chǎn)生三路PWM輸出,第三路不知道怎么輸出了?

    我想用ADUC7020產(chǎn)生三路PWM,并輸出,但是7020能配置成PWM的管教只有P3.0-P3.7,按我的理解,PLA的block2產(chǎn)生三路
    發(fā)表于 09-25 11:48

    STM32F103RCT6 6互補(bǔ)信號(hào)有三路PWM有缺陷

    我的STM32F103RCT6 Tim8輸出6互補(bǔ)信號(hào)中有三路PWM有缺陷,請(qǐng)問(wèn)可能是什么原因
    發(fā)表于 04-29 09:01

    如何使用STM32F407ZG的實(shí)現(xiàn)互補(bǔ)PWM輸出?

    如何使用STM32F407ZG的實(shí)現(xiàn)互補(bǔ)PWM輸出?
    發(fā)表于 11-26 07:45

    怎樣通過(guò)三路PWM輸出進(jìn)行RGB燈調(diào)色呢

    怎樣通過(guò)三路PWM輸出進(jìn)行RGB燈調(diào)色呢?其原理是什么?
    發(fā)表于 03-09 07:01

    三路輸出電路圖

    三路輸出電路圖 圖 三路輸出電路圖
    發(fā)表于 07-18 12:01 ?2050次閱讀
    <b class='flag-5'>三路</b><b class='flag-5'>輸出</b>電路圖

    三路輸出 LED 驅(qū)動(dòng)器驅(qū)動(dòng)多達(dá) 24 個(gè) 500mA LED 并提供 3000:1 的 True Color PWM 調(diào)光能力

    三路輸出 LED 驅(qū)動(dòng)器驅(qū)動(dòng)多達(dá) 24 個(gè) 500mA LED 并提供 3000:1 的 True Color PWM 調(diào)光能力
    發(fā)表于 03-20 22:36 ?2次下載
    <b class='flag-5'>三路</b><b class='flag-5'>輸出</b> LED 驅(qū)動(dòng)器驅(qū)動(dòng)多達(dá) 24 個(gè) 500mA LED 并提供 3000:1 的 True Color <b class='flag-5'>PWM</b> 調(diào)光能力

    ADP1828三路輸出電壓

    ADP1828三路輸出電壓
    發(fā)表于 04-23 15:09 ?9次下載
    ADP1828<b class='flag-5'>三路</b><b class='flag-5'>輸出</b>電壓

    STM32 TIM 多通道互補(bǔ)PWM波形輸出配置快速入門

    platform:stm32f103cb前言在做相逆變的時(shí)候,需要軟件生成SVPWM波形,具體的算法需要產(chǎn)生對(duì)互補(bǔ)PWM,這樣可以驅(qū)動(dòng)
    發(fā)表于 12-07 18:36 ?24次下載
    <b class='flag-5'>STM32</b> TIM 多通道<b class='flag-5'>互補(bǔ)</b><b class='flag-5'>PWM</b>波形<b class='flag-5'>輸出</b>配置快速入門

    普通定時(shí)器輸出互補(bǔ)PWM帶死區(qū)

    普通定時(shí)器輸出互補(bǔ)PWM帶死區(qū)一般來(lái)說(shuō)相半橋電路需要互補(bǔ)PWM驅(qū)動(dòng),而且
    發(fā)表于 12-16 16:59 ?24次下載
    普通定時(shí)器<b class='flag-5'>輸出</b><b class='flag-5'>互補(bǔ)</b><b class='flag-5'>PWM</b>帶死區(qū)

    STM32CUbeMX之兩互補(bǔ)pwm波 以及死區(qū)時(shí)間設(shè)置

    STM32CUbeMX之兩互補(bǔ)pwm波 以及死區(qū)時(shí)間設(shè)置STM32CUbeMX的配置keil工程里的代碼
    發(fā)表于 12-22 19:40 ?32次下載
    <b class='flag-5'>STM32</b>CUbeMX之兩<b class='flag-5'>路</b><b class='flag-5'>互補(bǔ)</b><b class='flag-5'>pwm</b>波 以及死區(qū)時(shí)間設(shè)置