娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

基于STM32芯片三路互補PWM輸出的設計實現

發布者:DelightWish123最新更新時間:2024-09-02 來源: elecfans關鍵字:STM32芯片  PWM輸出 手機看文章 掃描二維碼
隨時隨地手機看文章

硬件:Stm32f103c8t6最小系統。

開發平臺:MDK-Arm。

目的:使用Stm32高級定時器TIM1。配置中心對齊模式輸出三路互補PWM。

(1)Stm32的高級定時器:

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

TIM1的IO分配:

1.jpg

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

圖片

圖1

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

①時鐘選擇:

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

②控制器

控制器部分包含觸發控制器,從模式控制器,編碼器接口。觸發控制器可以為片內外設提供觸發信號。

③⑤時基單元和輸出比較

時基單元的計數模式選中心對齊模式和比較輸出的比較模式選PWM模式來講解。

首先時鐘源通過預分頻寄存器PSC分頻得到CK_CNT,得到計數器CNT計數頻率,計數器開始從0向上計數,每計一次,和CCR比較一次,當CRR>CNT, 輸出高電平,反之輸出低電平,計數器CNT繼續計數,當計數器等于ARR值時,計數器向下計數,當計數器CNT>CCR時,輸出低電平,反之輸出高電平。計數器周而復始向上向下計數并不斷的和CRR值比較,參考圖2。

圖片

圖2

實際此過程我們可以看成一個比較器,CRR作為參考電壓,接到比較器同相輸入端,CNT作為信號電壓,接到比較器反相輸入端,這樣根據比較輸出PWM。反之把CNT和CRR調換位置,會輸出相反極性的PWM,參考圖2.

計數器計數模式有:向上計數,向下計數,中心對齊計數。

比較輸出比較模式:凍結,匹配時設置通道x為有效電平,匹配時設置通道x為無效電平,翻轉,強制為無效電平,強制為有效電平,PWM1,PWM2。

死區發生器:

通過寄存器BDTR的位UTG[7:0]來配置死區時間,關于死區時間設置可以這篇文章:

⑥短路功能

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

④輸入捕獲

輸入捕獲可以對輸入的信號的上升沿,下降沿或者雙邊沿進行捕獲,常用的有測量輸 入信號的脈寬和測量 PWM 輸入信號的頻率和占空比這兩種。

輸入捕獲的大概的原理就是,當捕獲到信號的跳變沿的時候,把計數器 CNT 的值鎖存 到捕獲寄存器 CCR 中,把前后兩次捕獲到的 CCR 寄存器中的值相減,就可以算出脈寬或者頻率。如果捕獲的脈寬的時間長度超過你的捕獲定時器的周期,就會發生溢出,這個我 們需要做額外的處理。

(3)程序設計

程序使用ST官方固件庫,編程步驟:

①GPIO初始化;

②時基結構體TIM_TimeBaseInitTypeDef 初始化;

③比較結構體 TIM_OCInitTypeDef 初始化;

④剎車和死區結構體 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頻率和死區時間計算 */


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


//管開關頻率要求高,且開關損耗大,這里載波配置為20KHz。


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


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


//死區時間配置為2us


//64M/(CKD+1)/ UTG = 500KHz,換算成時間位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);//剎車

}

③定時器時基單元,輸出比較,剎車死區初始化:


static void AdvanceTIM1_Config(void){

  //開啟定時器時鐘,即內部時鐘CK_INT=64MHz

  RCC_APB2PeriphClockCmd(RCC_TIM_CLK,ENABLE);

/*--------------------時基結構體初始化-------------------------*/

  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;     

  TIM_TimeBaseStructure.TIM_Period = TIM_ARR;   //自動重裝載寄存器的值,累計TIM_Period+1個頻率后產生一個更新或者中斷      

  TIM_TimeBaseStructure.TIM_Prescaler = TIM_CK_PSC;   //驅動CNT計數器的時鐘 = Fck_int/(psc+1)

  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;  //時鐘分頻因子 ,配置死區時間時需要用到             

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1; //中心對齊1             

  TIM_TimeBaseStructure.TIM_RepetitionCounter = TIM_RCR;  //重復計數器的值,沒用到不用管      

  TIM_TimeBaseInit(TIMx, &TIM_TimeBaseStructure);  //初始化定時器

/*--------------------輸出比較結構體初始化-------------------*/             

  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;  //互補輸出使能       

  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;        //輸出通道電平極性配置

  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;      //互補輸出通道電平極性配置

  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;       //輸出通道空閑電平極性配置

  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;   //互補輸出通道空閑電平極性配置                  

  TIM_OCInitStructure.TIM_Pulse = TIM_CCRx;                        //設置占空比大小    

  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);               

/*-------------------剎車和死區結構體初始化-------------------*/

  //有關剎車和死區結構體的成員具體可參考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;

  //輸出比較信號死區時間配置,具體如何計算可參考 BDTR:UTG[7:0]的描述

  //這里配置的死區時間為2uS

  TIM_BDTRInitStructure.TIM_DeadTime = 128;

  TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;

  //當BKIN引腳檢測到高電平的時候,輸出比較信號被禁止,就好像是剎車一樣

  TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;

  TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;

  TIM_BDTRConfig(TIMx, &TIM_BDTRInitStructure);

  TIM_Cmd(TIMx, ENABLE);      

  //主輸出使能,當使用的是通用定時器時,這句不需要

  TIM_CtrlPWMOutputs(TIMx, ENABLE);                  

}


(4)程序燒錄驗證:圖3是一對PWM互補輸出波形。

圖片

圖3


關鍵字:STM32芯片  PWM輸出 引用地址:基于STM32芯片三路互補PWM輸出的設計實現

上一篇:STM32模數轉換器 (ADC)介紹
下一篇:硬件電路設計之STM32最小系統電路設計

推薦閱讀最新更新時間:2025-05-15 08:51

用TIM的PWM輸出模式寫一個步進電機的Stepper庫函數
這是之前寫平衡小車時自己用 TI M的PWM輸出模式寫了一個 步進電機 的Stepper庫函數。 1 調用順序 1.1 init函數 1.2 begin函數 1.3 setSpeed函數 2 Stepper類結構 3 TIM結構框圖 Stm32手冊中的結構框圖很重要,只要理解了外設的運行邏輯,按照邏輯一步一步給寄存器設值就可以讓外設按我們的要求運行。 #ifndef __STEPPER_H #define __STEPPER_H #include peripheral.h #include math.h #ifdef __cplusplus extern C { #endif
[嵌入式]
用TIM的<font color='red'>PWM</font><font color='red'>輸出</font>模式寫一個步進電機的Stepper庫函數
SMT32的PWM波形輸出配置總結
本文分享 STM32 之PWM波形輸出配置總結。 一. TI MER分類: STM32中一共有11個 定時器 ,其中TIM6、TIM7是基本定時器;TIM2、TIM3、TIM4、TIM5是通用定時器;TIM1和TIM8是高級定時器,以及2個 看門狗 定時器和1個系統嘀嗒定時器。其中系統嘀嗒定時器是前文中所描述的SysT ic k。 其中TIM1和TIM8是能夠產生3對PWM互補輸出,常用于三相 電機 的驅動, 時鐘 由APB2的輸出產生。TIM2-TIM5是普通定時器,TIM6和TIM7是基本定時器,其時鐘由APB1輸出產生。 二、PWM波形產生的原理: 通用定時器可以利用GPIO引腳進行脈沖輸出,在配置為比較輸出、PWM
[單片機]
SMT32的<font color='red'>PWM</font>波形<font color='red'>輸出</font>配置總結
如何通過STM32的定時器輸出PWM
本文將介紹通過STM32的定時器輸出PWM,如果對定時器不太熟悉的同學可以看下之前的文章《STM32基礎定時器詳解》,關于定時器的基礎功能不再詳解。 01 PWM介紹 PWM定義:脈沖寬度調制(PulseWidthModulation,PWM)簡稱脈寬調制。通俗講,PWM是一種對模擬信號電平進行數字編碼的方法。通過高分辨率計數器的使用,方波的占空比被調制用來對一個具體模擬信號的電平進行編碼。PWM信號仍然是數字的,因為在給定的任何時刻,滿幅值的直流供電要么完全有(ON),要么完全無(OFF)。電壓或電流源是以一種通(ON)或斷(OFF)的重復脈沖序列被加到模擬負載上去的。通的時候即是直流供電被加到負載上的時候,斷的時候即是供電
[單片機]
如何通過<font color='red'>STM32</font>的定時器<font color='red'>輸出</font><font color='red'>PWM</font>?
STM32 PWM輸出控制步進電機-3000轉每分鐘串口顯示+電位器調速
用電位器控制步進電機轉速,可以控制正反轉,在電位器中點停止;越往左翻轉越快,越往右正轉越快。速度均勻,包含濾波。付完整代碼。全部測試正常。 單片機源程序: #include led.h #include delay.h #include key.h #include sys.h #include usart.h #include timer.h #include adc.h int main(void) { u16 adcx; float temp; int a=3999; //int b=0 u16 led0pwmval=200; u8
[單片機]
STM32 F1 TIM4 4通道PWM同時輸出
void TIM4_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE); //
[單片機]
STM32F107高級定時器TIM1使用互補PWM輸出
學習后發現stm32的定時器功能確實很強大,小總結一下方便以后使用的時候做參考。Stm32定時器一共分為三種:tim1和tim8是高級定時器,6和7是基本定時器,2—5是通用定時器。從名字就可以看得出來主要功能上的差異。今天我主要是用定時器做pwm輸出,所以總結也主要是針對pwm方面的。 先大致說下通用和高級定時器的區別。通用的可以輸出四路pwm信號互不影響。高級定時器可以輸出三對互補pwm信號外加ch4通道,也就是一共七路。 所以這樣算下來stm32一共可以生成4*5+7*2=30路pwm信號。接下來還有功能上的區別:通用定時器的pwm信號比較簡單,就是普通的調節占空比調節頻率(別的不常用到的沒去深究);高級定時器的還帶有
[單片機]
STM32PWM輸出實現LED燈漸亮漸滅
/* *說明: *PA0:KEY1;PA1:KEY2; *PA2:LED1;PA3:LED2; *PA9:USART1_TX;PA10:USART1_RX */ #include stm32f10x.h #include stm32f10x_rcc.h #include stm32f10x_gpio.h #include stm32f10x_tim.h #include stm32f10x_pwr.h #include stm32f10x_exti.h #include system_stm32f10x.h #include misc.h void R
[單片機]
STM32 自定義頻率與占空比PWM輸出的方法
圖一 圖二 PWM應用非常廣泛,但是不同的項目對輸出的PWM又有特殊要求,為滿足這些要求我們需要更多的實驗來驗證。接下來講述圖一顯示波形的輸出方法步驟(圖二為異常波形)。 一、本實例所使用資源: 1、TIM4_CH3(對應管腳PB8)用于輸出PWM波形 2、TIM3用于產生中斷 3、MDK 軟件仿真方法 二、執行過程: 1、初始化配置TIM4_CH3對應管腳的PWM輸出功能(頻率與占空比可變)。 2、初始化配置使用TIM3定時器中斷功能,中斷時間的配置需要根據PWM輸出波形配置(定時器中斷時間可變)。 3、在main()函數中調用TIM4與TIM3的初始化函數。 三、具體代碼: int main(void) //主函數
[單片機]
<font color='red'>STM32</font> 自定義頻率與占空比<font color='red'>PWM</font><font color='red'>輸出</font>的方法
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 庄河市| 阿坝| 伊宁市| 太白县| 高台县| 都匀市| 光山县| 疏勒县| 长春市| 吉水县| 潞西市| 霍城县| 白朗县| 会宁县| 东城区| 乌拉特中旗| 佛冈县| 香格里拉县| 鄂温| 鸡东县| 济南市| 临桂县| 彭山县| 大关县| 那曲县| 永德县| 临清市| 吉水县| 贡山| 阿克苏市| 江津市| 衡山县| 云浮市| 乡宁县| 军事| 麦盖提县| 宜州市| 烟台市| 齐齐哈尔市| 沙坪坝区| 祁阳县|