STM32 高級定時器-PWM簡單使用

2020-12-07 電子產品世界
高級定時器與通用定時器比較類似,下面是一個TIM1 的PWM 程序,TIM1是STM32唯一的高級定時器。共有4個通道有 死區有互補。

本文引用地址:http://www.eepw.com.cn/article/201612/325215.htm

先是配置IO腳:

GPIO_InitTypeDef GPIO_InitStructure;

/* PA8設置為功能腳(PWM) */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

/*PB13 設置為PWM的反極性輸出*/

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure);

/*開時鐘PWM的 與GPIO的*/

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

/*配置TIM1*/

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_OCInitTypeDef TIM_OCInitStructure;

voidTim1_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;


TIM_DeInit(TIM1);//重設為預設值

/*TIM1時鐘配置*/
TIM_TimeBaseStructure.TIM_Prescaler = 4000;//預分頻(時鐘分頻)72M/4000=18K
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上計數
TIM_TimeBaseStructure.TIM_Period = 144;//裝載值 18k/144=125hz 就是說向上加的144便滿了
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//設置了時鐘分割不懂得不管
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0;//周期計數器值 不懂得不管
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);//初始化TIMx的時間基數單位

/* Channel 1 Configuration in PWM mode 通道一的PWM*/
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//正向通道有效 PA8
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;//反向通道也有效PB13
TIM_OCInitStructure.TIM_Pulse = 40; //佔空時間 144 中有40的時間為高,互補的輸出正好相反
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //輸出極性
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low; //互補端的極性
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;//空閒狀態下的非工作狀態 不管
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;//先不管

TIM_OC1Init(TIM1,&TIM_OCInitStructure); //數初始化外設TIMx通道1這裡2.0庫為TIM_OCInit

/* TIM1 counter enable開定時器 */
TIM_Cmd(TIM1,ENABLE);

/* TIM1 Main Output Enable 使能TIM1外設的主輸出*/
TIM_CtrlPWMOutputs(TIM1,ENABLE);
}

//設置捕獲寄存器1
voidSetT1Pwm1(u16 pulse)
{
TIM1->CCR1=pulse;
}

/*操作寄存器改變佔空時間*/

/*****************************************************************************************************************

TIM1的定時器通道時間 1到4 分別為 PB8 PA9 PA10 PA11 而互補輸出分別為 PB13 PB14 PB15

中止 PB12 。

如果輸出與互補輸出極性相同的話 就剛好輸出高 互補低 至於PWM模式1 與模式2的區別

在下圖:

這個是模式1的 了綠為輸出 黃為互補

*************************************************************************************************

上圖是模式2的情況 正好和模式1的反過來了 144中有40 為高 互補的有40為低。

*************************************************************************************************/

//在MAIN 中加點鍵盤掃描啥的 用來改變佔空比

/************************************************************
**實驗名稱:PWM
**功能:是PA8產生PWM輸出,PA8為驅動LED1和馬達的IO,
通過UP DOWN鍵,可以改變佔空比,從而讓ED1和小馬達的產生變化
**注意事項:LED是低有效,馬達則是高有效,所以LED全滅的時候馬達轉速達到最高.
**作者:電子白菜
*************************************************************/

#include"STM32Lib\\stm32f10x.h"
#include"hal.h"

extern voidSetT1Pwm1(u16 pulse);

intmain(void)
{
u16 pulse=40;
ChipHalInit();//片內硬體初始化
ChipOutHalInit();//片外硬體初始化

for(;;)
{
if(GET_UP())
{
while(GET_UP());
if(pulse<=144)
{
pulse+=5;
SetT1Pwm1(pulse);
}
}

if(GET_DOWN())
{
while(GET_DOWN());
if(pulse>30)
{
pulse-=5;
SetT1Pwm1(pulse);
}
}
}


}

/***************************************************************************************/

再來兩張 最小系統板子

/***************************************************************************************/

你也只需一塊這樣板子再來一點時間與幹勁這個歷程一樣跑的起來。

相關焦點

  • stm32f407之高級定時器 死區互補PWM(操作寄存器)
    高級定時器的功能有很多,這裡只介紹死區互補PWM輸出功能。其實死區互補PWM跟通用定時器的PWM配置差異不大,只是需要設置多CCER寄存器中的幾個位以及剎車與死區寄存器BDTR。對寄存器的具體描述請參考數據手冊。配置步驟:1.     使能相關時鐘。2.
  • stm32單片機中使用GPIO口模擬PWM輸出解析
    PWM   PWM控制技術以其控制簡單,靈活和動態響應好的優點而成為電力電子技術最廣泛應用的控制方式,也是人們研究的熱點。由於當今科學技術的發展已經沒有了學科之間的界限,結合現代控制理論思想或實現無諧振波開關技術將會成為PWM控制技術發展的主要方向之一。
  • STM32定時器捕獲PWM脈衝頻率
    每個定時器有四個輸入捕獲通道IC1、IC2、IC3、IC4。且IC1 IC2一組,IC3 IC4一組。並且可是設置管腳和寄存器的對應關係。2. 同一個TIx輸入映射了兩個ICx信號。3. 這兩個ICx信號分別在相反的極性邊沿有效。4. 兩個邊沿信號中的一個被選為觸發信號,並且從模式控制器被設置成復位模式。5.
  • stm32庫函數學習篇通用定時器輸入捕獲功能
    本文引用地址:http://www.eepw.com.cn/article/201611/318488.htm先有必要了解stm32定時器的輸入觸發模塊,如下圖:也就是說,每個通用定時器都只有四個獨立通道,當某一通道作為了輸入觸發功能那就不能再作為輸出匹配功能。這一點我們也可以從其他地方找到印證。
  • STM32F4輸出PWM波形的配置總結
    單片機輸出pwm的原理涉及模塊:GPIO、TIM1主要寄存器:TIMx_CCR、TIMx_ARR、TIMx_CNT原理圖通用定時器可以利用GPIO引腳進行脈衝輸出,在配置為比較輸出、PWM輸出功能時,捕獲/比較寄存器TIMx_CCR被用作比較功能,下面把它簡稱為比較寄存器。
  • 一個定時器生成多路PWM波形的原理和方法
    在很多工程應用中,需要使用到PWM波(脈寬調製),例如電機調速、溫度控制調整功率等。本文講述怎麼利用單片機的一個定時器生成多路PWM波形。一般的,PWM的周期t1是一個固定值,如1ms,10ms,100ms等,在一個周期中包含了高電平t2和低電平t3,它們的關係是t2+t3=t1。
  • avr單片機和stm32區別與優缺點分析
    摘要:avr單片機和stm32單片機是目前使用較廣泛的單片機,那麼avr單片機和stm32單片機有什麼區別呢?有什麼優劣勢呢?相比,avr 8-bit MCU最大的特點是:   ● 哈佛結構,具備1MIPS / MHz的高速運行處理能力;   ● 超功能精簡指令集(RISC),具有32個通用工作寄存器,克服了如8051 MCU採用單一ACC進行處理造成的瓶頸現象;   ● 快速的存取寄存器組、單周期指令系統,大大優化了目標代碼的大小、執行效率,部分型號FLASH非常大,特別適用於使用高級語言進行開發
  • STM32 定時器的4通道計數器應用
    通用定時器確實比較強悍,功能極多我也比較暈此為在不牽扯PWM與DMA下像C51那樣計數點燈。本文引用地址:http://www.eepw.com.cn/article/201611/317176.htm當然你要配置一些IO口作為點燈用這裡就不詳細說了。
  • 用SST單片機的PCA功能產生PWM脈衝
    利用PCA的脈衝寬度調製(PWM)模式可以產生一個8位PWM,它通過比PCA定時器的低位(CL)和比較寄存器的低位(CCAPnL)產生。當CLCCAPnL時輸出為低;當CL>=CCAPnL是輸出為高。要進入這個模式,可以對CCAPMn的PWM和ECOM位置位。在PWM 模式,輸出的頻率決定於PCA定時器的源。由於只有一對CH 和CL寄存器,所有模塊共享PCA定時器和頻率。
  • MSP430 定時器輸出PWM波形
    定時器的PWM輸出有有8種模式:輸出模式0  輸出模式:輸出信號OUTx由每個捕獲/比較模塊的控制寄存器CCTLx中的OUTx位定義,並在寫入該寄存器後立即更新。最終位OUTx直通。 輸出模式1 置位模式:輸出信號在TAR等於CCRx時置位,並保持置位到定時器復位或選擇另一種輸出模式為止。
  • 如何採用STM32中的控制定時器Tim1實現計數器功能
    STM32中的高級控制定時器(Tim1)是由一個16位的自動裝載計數器組成,它由一個可編程預分頻器驅動。 用途在於:測量輸入信號的脈衝寬度(輸入捕獲),或者產生輸出波形(輸出比較,PWM,嵌入死區時間的互補PWM等)。 使用定時器預分頻器和RCC時鐘控制預分頻器,可以實現脈衝寬度和波形周期從幾個微秒到幾個毫秒的調節。
  • 多路舵機控制PWM發生器的設計與Proteus仿真
    摘要:PWM脈寬信號調製是現代電子行業中使用較為廣泛的一種脈衝信號,其典型應用就是舵機控制。2 舵機及其工作原理2.1 舵機簡介 舵機英文稱Servo,也稱伺服機,其特點是結構緊湊、易於安裝調試、控制簡單、大扭力、成本較低等。舵機是一種位置伺服的驅動器,主要用於各種飛行器的執行機構。其工作原理是:控制信號由接收機的通道進入信號調試晶片,從而獲得直流偏置電壓。
  • 基於STM32定時器的紅外遙控數據接收設計原理
    2、定時器計數和輸入捕獲 定時器就是按照一個特定的頻率對計數值進行加一或減一操作,當數值溢出時則產生一個標誌或中斷。 定時器的輸入捕獲就是可以測量輸入信號的脈衝寬度。 本次就是通過普通計數和輸入捕獲的結合來實現的。
  • 用ULN2003驅動24BYJ48步進電機時,怎麼接stm32單片機比較好?
    stm32單片機是一種高性能、低成本、低功耗的單片機,可以說很多應用場合都會用到,特別是對於大型系統,像電源、充電樁、交互機、電機驅動、PLC、逆變器、印表機、掃描儀、警報系統、視頻電話、 HVAC 等。那麼對於如何用STM32驅動步進電機呢?
  • PCA9685--16路 PWM模塊舵機驅動板--STM32 IIC接口模塊
    i2c通信,只需要2根i2c線就可以控制16路pwm,周期和佔空比都可控。可以多個模塊級聯。箭頭部分可以更改設備id。可以控制16路輸出端的開、關、pwm以及佔空比。還是主要i2c要正確使用。要設置的周期*/void setPWMFreq(float freq);/*num:設置第num個輸出口輸出量變化on與off:配合產生佔空比 0~on為低電平 ,到on為高電平,到off轉為低電平 */void setPWM(u8 num, u16 on, u16 off);上面的用的不方便就封裝為簡單的
  • 使用STM32 的DSP庫進行FFT變換
    * 使用三角函數生成採樣點,供FFT計算* 進行FFT測試時,按下面順序調用函數即可:* dsp_asm_init();* dsp_asm_test();*/#include "stm32f10x.h"#include "dsp_asm.h"#include "stm32_dsp.h"#include "table_fft.h"
  • 簡單的1小時定時器電路圖
    打開APP 簡單的1小時定時器電路圖 網絡整理 發表於 2020-05-06 16:53:41   簡單的1小時定時器電路圖(一)   微妙到1小時定時器電路如下圖所示,該電路採用高輸入電阻場效應管輸入級運算放大器3140,可使555定時器定時範圍增加到100倍。
  • AVR——使用定時器必須弄清的幾個概念
    定時器是獨立運行的,它不佔用CPU的時間,不需要指令,只有調用對應的寄存器的時候才需要參與。以AVR mega16為例,它有三個寄存器,timer0,timer1和timer2,T0和T2是8位定時器,T1是16位寄存器,T2為異步定時器,三個定時器都可以用於產生PWM。
  • 定時器
    ;手機中鬧鐘設定之類的;從電視上我們了解之前人類有使用過一炷香的燃燒時間來表示經過了幾個時辰;但是最早其實我們使用的是沙漏和水滴來計算時間的,後來發明了鐘錶,隨著鐘錶誕生發展成熟之後,人們開始嘗試使用這種全新的計時工具來改進定時器,達到準確控制時間的目的。
  • 用Arduino剖析PWM脈寬調製
    即:使用數字控制產生佔空比不同的方波(一個不停在開與關之間切換的信號)來控制模擬輸出。我們要在數字電路中輸出模擬信號,就可以使用PWM技術實現。在嵌入式開發中,我們常用PWM來驅動LED的暗亮程度,電機的轉速等。原理 我們知道,在數字電路中,電壓信號是離散的:不是 0(0V)  就是 1(5V或者3.3V), 那麼如何輸出介於 0v 和  5V之間的某個電壓值呢?