文章目錄
- 一.概要
- 二.PWM產生框架圖
- 三.CubeMX配置一個TIME輸出1KHZ,占空比50%PWM波例程
- 1.硬件準備
- 2.創建工程
- 3.測量波形結果
- 四.CubeMX工程源代碼下載
- 五.講解視頻鏈接地址
- 六.小結
一.概要
脈沖寬度調制(PWM),是英文“Pulse Width Modulation”的縮寫,簡稱脈寬調制,是利用單片機數字輸出(1或0)來對外部模擬電路進行控制的一種非常有效的技術。
PWM波主要應用場景:
電機控制
PWM信號可以用來控制直流電機的轉速和位置,實現對電機的精確控制。在無刷直流電機(BLDC)和步進電機中,利用PWM調制可以充分發揮電子設備的精確度和能效。
LED燈光調光
PWM信號可用于調控LED燈的亮度。通過改變PWM信號的占空比(on-time和off-time的比值),可以實現對LED燈光的調光操作,達到節能和避免眩光的效果。
電源管理
采用PWM技術的開關穩壓器(如降壓轉換器)在電源管理中具有廣泛的應用。
音頻放大器
在數字音頻放大器中,PWM信號用于控制音頻信號的放大和調制。
混合動力電動汽車(HEV)和電動汽車(EV)
PWM信號用于控制電池充放電和電動機的驅動管理,提高電池的使用性能和壽命。
伺服系統
在伺服系統中,PWM信號用于傳輸伺服電機的控制信號,實現對伺服電機的精確控制。
二.PWM產生框架圖
定時器部分框圖如下,其中PWM相關的主要是基本定時器和PWM輸出控制部分,基本定時器主要控制PWM輸出的頻率,PWM控制部分主要控制PWM輸出的占空比。
PWM輸出控制部分信號流向
主要寄存器
1.TIMx_CCR1
捕獲比較(值)寄存器(x=1,2,3,4):設置比較值。
2.TIMx_CNT
計數器值與捕獲比較寄存器CCR1進行比較,通過比較結果輸出有效電平和無效電平 。
3.TIMx_ARR
自動重裝載寄存器,計數器(TIMx_CNT)開始計數,直到計數器(TIMx_CNT)達到TIMx_ARR中存放的值后,重新回到0,依次循環 。
在PWM工作模式下,引入一個寄存器CCRx,這個寄存器用于控制PWM輸出波的有效電平長度(占空比),假定定時器工作在向上計數 PWM模式,且當 CNT<CCRx 時,輸出 0,當 CNT>=CCRx 時輸出 1。當 CNT 達到 ARR 值的時候,重新歸零,然后重新向上計數,依次循環。改變 CCRx 的值,就可以改變 PWM 輸出的占空比,改變 ARR 的值,就可以改變 PWM 輸出的頻率。
工作過程如下圖所示
三.CubeMX配置一個TIME輸出1KHZ,占空比50%PWM波例程
1.硬件準備
STLINK接STM32F103C8T6小系統板,STLINK接電腦USB口。
2.創建工程
打開STM32CubeMX軟件,新建工程
Part Number處輸入STM32F103C8,再雙擊就創建新的工程
配置下載口引腳
配置外部晶振引腳
配置系統主頻
配置TIM1,1ms定時器,TIM1內部時鐘是72MHZ,72分頻就是1MHZ,計數1000次歸零,計數時間就是1ms,脈沖寬度是500us,根據上述配置,PWM波頻率就是1KHZ,占空比就是50%。
配置工程文件名,保存路徑,KEIL5工程輸出方式
生成工程
用Keil5打開工程
增加代碼
主要代碼如下
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_TIM1_Init();/* USER CODE BEGIN 2 */if (HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1) != HAL_OK)//啟動定時器通道1,PWM輸出{/* PWM generation Error */while(1);}/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}void MX_TIM1_Init(void)
{TIM_ClockConfigTypeDef sClockSourceConfig = {0};TIM_MasterConfigTypeDef sMasterConfig = {0};TIM_OC_InitTypeDef sConfigOC = {0};TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};htim1.Instance = TIM1;htim1.Init.Prescaler = 71;htim1.Init.CounterMode = TIM_COUNTERMODE_UP;htim1.Init.Period = 999;htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim1.Init.RepetitionCounter = 0;htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;if (HAL_TIM_Base_Init(&htim1) != HAL_OK){}sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK){}if (HAL_TIM_PWM_Init(&htim1) != HAL_OK){}sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK){}sConfigOC.OCMode = TIM_OCMODE_PWM1;sConfigOC.Pulse = 500;sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK){}sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;sBreakDeadTimeConfig.DeadTime = 0;sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK){}HAL_TIM_MspPostInit(&htim1);}
3.測量波形結果
通過波形接收器測量PA8引腳
四.CubeMX工程源代碼下載
鏈接:https://pan.baidu.com/s/1ZOkxY7d7Gz1jXCvHHzF6uA
提取碼:bhf6
如果鏈接失效,可以聯系博主給最新鏈接
程序下載下來之后解壓就行
五.講解視頻鏈接地址
PWM輸出實驗
六.小結
脈沖寬度調制(PWM:Pulse Width Modulation)可以廣泛應用于電機控制、燈光的亮度調節、功率控制等領域,所以在那些領域避免不了需要用到PWM輸出技能。