STM32F103 PWM輸出實驗(HAL庫)
阿新 • • 發佈:2019-01-25
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並行佔空比。