1. 程式人生 > >STM32 PWM的輸出與Keil軟體模擬

STM32 PWM的輸出與Keil軟體模擬

STM32 PWM的輸出

脈衝寬度模式(PWM模式)可以用來產生一個由TIMx_ARR暫存器確定平率,由TIMx_CCRx暫存器確定佔空比的訊號。在STM32開發中,由於官方提供了較為完善的庫函式,使得我們的開發工作變得相當的輕鬆,甚至可以在不需要太多瞭解硬體結構的條件下,完成我的開發工作,實現我們所需要的功能。在此,筆者也建議大家,在初學的時候儘量去熟悉韌體庫中提供的函式來調節PWM的頻率和佔空比,對底層暫存器的操作應儘量減少。

本文使用的STM32F103RB的晶片,輸出通道是TIM2_CH2通道,STM32有較強的可移植性,如果讀者的晶片型別跟我不一樣,可以做適當的修改,完成自己的開發。

使用到的庫函式有:
stm32f10x.h:用以系統的初始化,無論做什麼開發,該庫必須包含
stm32f10x_tim.h:TIM定時器庫函式
stm32f10x_rcc.h:時鐘配置庫函式
stm32f10x_gpio.h:GPIO配置庫函式

由以上的庫函式可知,我們需要初始化的內容有TIM2定時器,時鐘使能配置,GPIO的使能配置。

void RCC_Config(void);
void GPIO_Config(void);
void TIM_Config(void);

接下來就是編寫各個函式的函式體,在這些內容裡面,其實官方已經給出了示例,我們按照官方給的函式庫進行配置,然後修改一下官方的一些變數屬性即可。

RCC_Config函式體

void RCC_Config(void)
{
        //使能GPIOA,TIM2
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
}

GPIO_Config函式體

void GPIO_Config(void)
{
//GPIO的配置,官方庫有給出需要配置的一些引數,如果忘記了,參照一下即可,我這裡配置的是GPIOA_Pin_1
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Pin
=GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); }

TIM_Config函式體
在配置函式體之前,先了解一下stm32的佔空比以及頻率是如何計算的
①頻率:我們使用的APB1時鐘源是72MHz的,在此我們不做分頻,通過配置相關的引數來設定輸入頻率,計算方法:輸入頻率=APB1時鐘/(預分頻係數+1)=72000000Hz/360=200000Hz
②TIM_TImeBaseStructure.TIM_Period引數決定了輸出PWM波形的頻率,輸出PWM波形的頻率=定時器的輸入頻率/TIM_TImeBaseStructure.TIM_Period,本例程20000Hz/100=200Hz,即5ms一個週期
③配置佔空比:佔空比=配置佔空比的值/ TIM_TImeBaseStructure.TIM_Period,以此計算來確定佔空比,本案例的佔空比為50/100=50%
④定時器使能

void TIM_Config(void)
{
        TIM_TimeBaseInitTypeDef TIM_TImeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;

    //配置TIM2的時鐘輸出頻率,以及其它相關引數初始化
        TIM_TImeBaseStructure.TIM_Prescaler=360-1;//設定PWM的頻率
        TIM_TImeBaseStructure.TIM_CounterMode=0;
        TIM_TImeBaseStructure.TIM_Period=100;
        TIM_TimeBaseInit(TIM2,&TIM_TImeBaseStructure);


    //設定PWM的輸出方式
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
        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_OCIdleState_Reset;   
    //配置佔空比
        TIM_OCInitStructure.TIM_Pulse=50;

        TIM_OC2Init(TIM2,&TIM_OCInitStructure);
        TIM_ForcedOC1Config(TIM2,TIM_ForcedAction_Active);
        TIM_Cmd(TIM2,ENABLE);
        TIM_CtrlPWMOutputs(TIM2,ENABLE);

}

由此,我們的整個PWM配置完成
Main函式

int main()
{
        RCC_Config();
        GPIO_Config();
        TIM_Config();
        while(1)
        {
                ;
        }
}

接下來,我們講解一下,在Keil裡面看我們的GPIOA_Pin_1引腳的輸出頻率,波形

Keil軟體模擬

①配置除錯工具
這裡寫圖片描述

②開啟除錯,並設定並檢測GPIO的輸出引腳
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

③全速執行,觀察示波器
這裡寫圖片描述
這裡寫圖片描述

相關推薦

STM32 PWM輸出Keil軟體模擬

STM32 PWM的輸出 脈衝寬度模式(PWM模式)可以用來產生一個由TIMx_ARR暫存器確定平率,由TIMx_CCRx暫存器確定佔空比的訊號。在STM32開發中,由於官方提供了較為完善的庫函式,使得我們的開發工作變得相當的輕鬆,甚至可以在不需要太多瞭解硬體

STM32 PWM輸出(映射)

ocm base term period 修改 etc cmd struct 映射   STM32 的定時器除了 TIM6 和 7。其他的定時器都可以用來產生 PWM 輸出。其中高級定時器 TIM1 和 TIM8 可以同時產生多達 7 路的 PWM 輸出。而通用定時器也能同

stm32 PWM輸出學習

STM32 的定時器除了 TIM6 和 7,其他的定時器都可以用來產生 PWM 輸出。其中高階定時器 TIM1 和 TIM8 可以同時產生多達 7 路的 PWM 輸出。通用定時器也能同時產生多達 4路

STM32 自定義頻率佔空比PWM輸出的方法

圖一 圖二 PWM應用非常廣泛,但是不同的專案對輸出的PWM又有特殊要求,為滿足這些要求我們需要更多的實驗來驗證。接下來講述圖一顯示波形的輸出方法步驟(圖二為異常波形)。 一、本例項所使用資源: 1、TIM4_CH3(對應管腳PB8)用於輸出PWM波形 2、TIM3用於

STM32學習筆記(5)——通用定時器PWM輸出

part 大小 模式 lan 晶振 kcon 筆記 利用 .cn 1、TIMER輸出PWM基本概念 脈沖寬度調制(PWM),是英文“Pulse Width Modulation”的縮寫,簡稱脈寬調制,是利用微處理器的數字輸出來對模擬

STM32學習筆記(7)——通用定時器PWM輸出

nbsp 錯誤 buffer put inter def internal reset 有效 1、TIMER輸出PWM基本概念 脈沖寬度調制(PWM),是英文“Pulse Width Modulation”的縮寫,簡稱脈寬調制,是利

STM32標準庫及的Keil軟體包下載

在安裝好Keil開發工具後,還需要分別安裝STM32相關的軟體包及相關的函式庫。   由於官網一般下載速度較慢,將常用及標準庫上傳在網盤上,可自行下載。 Keil軟體包 連結:https://pan.baidu.com/s/1Uh1J0L9gZSIWKtDzocQWJA&n

STM32的TIM1互補PWM輸出

原文連結:STM32的TIM1互補PWM輸出 晶片為STM32F412VETx,使用的是高階定時器TIM1的PWM互補PWM輸出,看一下STM32CubeMX配置, 再看時鐘的配置,TIM1用的是APB2的時鐘,。 再看引腳的配置 產生的PWM頻率為:Fpwm

stm32如何實現PWM輸出及週期內ADC取樣

1.TIM1 通道一設定為PWM模式, 通道3設定為Timing模式,同時允許TIM_IT_Update和TIM_IT_CC3更新中斷; 2.stm32的ADC有三種方法:(取樣方法三 TIM8+ADC1+DMA2)     A、使用定時器中斷每隔一

無人機飛行控制演算法、控制律設計軟體半物理模擬

工業級多功能可程式設計飛行控制系統 專業的圖形化控制律設計軟體 靈活強大的工程應用開發平臺 DSP處理器及高精度感測器 自定義高速遙測資料採集 嵌入式半物理模擬系統 豐富的使用者裝置介面 適用於固定翼、旋翼機、特殊飛行器、車船艇、機器人、雲臺等 概 

STM32 定時器2 CH1 CH2 PWM輸出 產生呼吸燈效果

     PWM一般用來驅動電機(控制速度),控制LED亮度,驅動開關電源電路等等,本例項通過改變PWM佔空比的方式來驅動LED燈,形成呼吸燈的效果。用這種方式來學習STM32 TIM2輸出PWM的配置。      以STM32F103C8T6為例,從其資料手冊中可以看到,P

STM32學習筆記(5):通用定時器PWM輸出

PWM的輸出管腳是確定好的,具體的引腳功能可以檢視《STM32參考手冊》的“8.3.7 定時器複用功能重對映”一節。在此需要強調的是,不同的TIMx有分配不同的引腳,但是考慮到管腳複用功能,STM32提出了一個重映像的概念,就是說通過設定某一些相關的暫存器,來使得在其他非原始指定的管腳上也能輸出PWM。但是這

關於MDK5在STM32中對F103軟體模擬支援

1、在 Debug 選項卡中將 Simulation 中(最下面)的 Dialog.dll 設定為 DARMSTM.DLL 2、將 Parameter設定為你的器件型號,例如我用的是 -pSTM32

機器人作業系統ROS(indigo)三維模擬軟體V-Rep(3.2.1)通訊介面使用筆記

通過網頁快速瞭解Linux(Ubuntu)和ROS機器人作業系統,請參考實驗樓線上系統如下:關鍵字:ROS(indigo),V-Rep(3.2.1), vrep_ros_bridge(lagadic).vrep_ros_bridge提供了V-Rep和ROS之間的通訊介面,可以

gpio軟體模擬IIC硬體IIC驅動有什麼區別

最近做一個專案,涉及到晶片級的通訊方面的知識(IIC和SPI方面的通訊)。但是方案選擇的時候,發現自身對模擬IO口通訊還是韌體驅動通訊一直沒有一個很全面的認識,所以就在此記錄一下。 所謂硬體I2C對應晶片上的I2C外設,有相應I2C驅動電路,其所使用的I2C管

STM32 DAC輸出,引腳設定成模擬輸入

開啟 IO口時鐘,設定引腳為模擬輸入。 STM32F103ZET6 的 DAC 通道 1 在 PA4 上,所以,我們先要使能 PORTA 的時鐘,然後設定 PA4 為模擬輸入。DAC 本身是輸出,但是為什麼埠要設定為模擬輸入模式呢?因為一但使能 DACx 通道之後,相應的

STM32 PWM波驅動模擬舵機(庫函式版)

數字舵機 vs 模擬舵機 “數字舵機區別於傳統的模擬舵機,模擬舵機需要給它不停的傳送PWM訊號,才能讓它保持在規定的位置或者讓它按照某個速度轉動,數字舵機則只需要傳送一次PWM訊號就能保持在規定的某個位置。” "到底模擬舵機與數碼舵機在實際使用中有什麼區別呢?我自己總結大致

STM32軟體模擬IIC

                               IIC匯流排 一、與IIC有關的知識 (1)IIC屬於半雙工通訊方式 (2)IIC的協議     1.空閒狀態:IIC的SCL和SDA兩條線均處於高電平狀態,此時即釋放匯流排     2.起始訊號(Start):

STM32硬體IIC51模擬IIC通訊

IIC介紹   IIC協議規定:SDA上傳輸的資料必須在SCL為高電平期間保持穩定,SDA上的資料只能在SCL為低電平期間變化。IIC期間在脈衝上升沿把資料放到SDA上,在脈衝下降沿從SAD上讀取資料。這樣的話,在SCL高電平期間,SDA上的資料是穩定的。在脈

對於STM32無法軟體模擬問題

一直在除錯STM32定時器pwm和時鐘輸出,用軟體方正GPIO的輸出,之前還是好好地,可是今天改了改之前的程式,卻突然不能正常的軟體模擬了,並且提示出現以下這樣的錯誤,懷疑是哪個地方設定有問題,然後就對著正點原子的工程配置,發現配置出錯! *** error 65: acc