STM32F103 PWM輸出實驗(HAL庫)


1、芯片輸出PWM波形打碼步驟

  1.0主函數

int main(void)
{     
    HAL_Init();                             //初始化HAL庫    
    Stm32_Clock_Init(RCC_PLL_MUL9);       //設置時鍾,72M
    delay_init(72);                       //初始化延時函數
    uart_init(115200);                    //初始化串口
    LED_Init();                            //初始化LED    
    TIM1_PWM_Init(20000,72);                //72分頻,即1M 。 1000000/20000 = 50 Hz ,即20ms
       while(1)
    {
        TIM_SetTIM1Compare1(1500);
    } 
}

 

  1.1初始化輸出PWM波形的定時器和IO口(例程使用定時器1的通道1,輸出在PA8)

  

GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_TIM1_CLK_ENABLE();            //使能定時器1
__HAL_RCC_GPIOA_CLK_ENABLE();            //開啟GPIOA時鍾        
GPIO_Initure.Pin=GPIO_PIN_8;               //PA8
GPIO_Initure.Mode=GPIO_MODE_AF_PP;      //復用推挽輸出
GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
HAL_GPIO_Init(GPIOA,&GPIO_Initure);     

  1.2初始化定時器1,HAL庫中,使用定時器的 PWM 輸出功能時, HAL 庫為我們提供了一個獨立的定時器初始化函數 HAL_TIM_PWM_Init ()

TIM_HandleTypeDef     TIM1_Handler;          //定時器句柄 
TIM1_Handler.Instance=TIM1;             //定時器1
TIM1_Handler.Init.Prescaler=psc;           //定時器分頻
TIM1_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上計數模式
TIM1_Handler.Init.Period=arr;              //自動重裝載值
TIM1_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Init(&TIM1_Handler);           //初始化PWM

  1.3初始化通道並開啟PWM

TIM_OC_InitTypeDef     TIM1_CH1Handler;    //定時器1通道1句柄
TIM1_CH1Handler.OCMode=TIM_OCMODE_PWM1; //模式選擇PWM1
TIM1_CH1Handler.Pulse=arr/2;            //設置比較值,此值用來確定占空比,默認比較值為自動重裝載值的一半,即占空比為50%
TIM1_CH1Handler.OCPolarity=TIM_OCPOLARITY_HIGH; //輸出比較極性為高  
HAL_TIM_PWM_ConfigChannel(&TIM1_Handler,&TIM1_CH1Handler,TIM_CHANNEL_1);
//配置TIM1通道1 HAL_TIM_PWM_Start(&TIM1_Handler,TIM_CHANNEL_1);//開啟PWM通道1

  1.4提供設置比較值的函數

//設置TIM1通道1的占空比
//compare:比較值
void TIM_SetTIM1Compare1(u32 compare)
{
    TIM1->CCR1=compare; 
} 

 

2、輸出PWM原理及代碼解釋

  設置PWM周期和一個比較值,技術過程中比較值和計數值進行比較,判斷輸出有效電平還是無效電平,達到輸出PWM波的目的。

  如圖CRRx是比較值,ARR是重裝值(達到該值重裝為0)

 

  2.1時鍾和IO口初始化略。

  2.2在定時器初始化中。

TIM1_Handler.Init.Prescaler=psc;           //定時器分頻

 

   所述分頻將時鍾頻率分為更小的頻率,如STM32F103是設置72M的時鍾頻率,設置psc=72分頻,得到1M時鍾頻率。

TIM1_Handler.Init.Period=arr;              //自動重裝載值

 

  在設置arr=20000重裝初值,由公式1M/20000=50Hz,即周期T=20ms 。

TIM1_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上計數模式

 

  設置計數方式為向上計數逐一增加從0到19999。此時得到的是20ms就重裝初值的定時器。

  2.3在通道1初始化及PWM開啟代碼中

TIM1_CH1Handler.OCMode=TIM_OCMODE_PWM1; //模式選擇PWM1

  選擇的PWM模式:PWM模式1:計數值<比較值時輸出有效電平,計數值>比較值輸出無效電平。

TIM1_CH1Handler.Pulse=arr/2;            //設置比較值,此值用來確定占空比,默認比較值為自動重裝載值的一半,即占空比為50%

  設置比較值,供計數值比較。

TIM1_CH1Handler.OCPolarity=TIM_OCPOLARITY_HIGH; //輸出比較極性為高

  設置有效電平是高電平還是低電平。

 

3、總結

  本文章主要講述了HAL庫輸出PWM波形的代碼編寫,提供了改變比較值的函數,使用戶可以動態的改變PWM並行占空比。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM