STM32F429定時器4生成PWM,轉化爲DAC

STM32F429時鐘樹

原文地址

定時器PWM

從STM32F4的內部時鐘樹可知,

(1)高級定時器timer1, timer8以及通用定時器timer9, timer10, timer11的時鐘來源是APB2總線
(2)通用定時器timer2-timer5,通用定時器timer12-timer14以及基本定時器timer6,timer7的時鐘來源是APB1總線
(3)當APB1和APB2分頻數爲1的時候,TIM1、TIM8-TIM11的時鐘爲APB2的時鐘,TIM2-TIM7、TIM12-TIM14的時鐘爲APB1的時鐘;
(4)而如果APB1和APB2分頻數不爲1,那麼TIM1、TIM8-TIM11的時鐘爲APB2的時鐘的兩倍,TIM2-TIM7、TIM12-TIM14的時鐘爲APB1的時鐘的兩倍。

PWM計算

PWM頻率 = 定時器頻率/(分頻係數 x 自動重裝載值)
PWM佔空比 = CCRx / 自動重裝載值。

#include "pwmdac.h"



TIM_HandleTypeDef TIM4_Handler;         //定時器4 PWM句柄 
TIM_OC_InitTypeDef TIM4_CH2Handler;	    //定時器9通道2句柄

//PWM DAC初始化(也就是TIM4通道2初始化)
//PWM輸出初始化
//arr:自動重裝值
//psc:時鐘預分頻數
void TIM4_CH2_PWM_Init(u16 arr,u16 psc)
{ 
    TIM4_Handler.Instance=TIM4;            //定時器9
    TIM4_Handler.Init.Prescaler=psc;       //定時器分頻
    TIM4_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上計數模式
    TIM4_Handler.Init.Period=arr;          //自動重裝載值
    TIM4_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_PWM_Init(&TIM4_Handler);       //初始化PWM
    
    TIM4_CH2Handler.OCMode=TIM_OCMODE_PWM1; //模式選擇PWM1
    TIM4_CH2Handler.Pulse=arr/2;            //設置比較值,此值用來確定佔空比,默認比較值爲自動重裝載值的一半,即佔空比爲50%
    TIM4_CH2Handler.OCPolarity=TIM_OCPOLARITY_HIGH; //輸出比較極性爲高
    HAL_TIM_PWM_ConfigChannel(&TIM4_Handler,&TIM4_CH2Handler,TIM_CHANNEL_2);//配置TIM9通道2
	HAL_TIM_PWM_ConfigChannel(&TIM4_Handler,&TIM4_CH2Handler,TIM_CHANNEL_1);//配置TIM9通道2
    HAL_TIM_PWM_Start(&TIM4_Handler,TIM_CHANNEL_2);//開啓PWM通道2
	HAL_TIM_PWM_Start(&TIM4_Handler,TIM_CHANNEL_1);//開啓PWM通道2
	
	HAL_TIM_PWM_ConfigChannel(&TIM4_Handler,&TIM4_CH2Handler,TIM_CHANNEL_3);//配置TIM9通道2
	HAL_TIM_PWM_ConfigChannel(&TIM4_Handler,&TIM4_CH2Handler,TIM_CHANNEL_4);//配置TIM9通道2
    HAL_TIM_PWM_Start(&TIM4_Handler,TIM_CHANNEL_3);//開啓PWM通道2
	HAL_TIM_PWM_Start(&TIM4_Handler,TIM_CHANNEL_4);//開啓PWM通道2
}

//定時器底層驅動,時鐘使能,引腳配置
//此函數會被HAL_TIM_PWM_Init()調用
//htim:定時器句柄
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
    GPIO_InitTypeDef GPIO_Initure;
	__HAL_RCC_TIM4_CLK_ENABLE();			//使能定時器9
	__HAL_RCC_GPIOD_CLK_ENABLE();			//開啓GPIOA時鐘
	
    GPIO_Initure.Pin=GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;           	//PA3
    GPIO_Initure.Mode=GPIO_MODE_AF_PP;  	//複用推完輸出
    GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
	GPIO_Initure.Alternate= GPIO_AF2_TIM4;	//PA3複用爲TIM9_CH2
    HAL_GPIO_Init(GPIOD,&GPIO_Initure);
}

//設置TIM通道2的佔空比
//TIM_TypeDef:定時器
//compare:比較值
void TIM_SetTIM4Compare2(u32 compare)
{
	TIM4->CCR1=compare;
	TIM4->CCR2=compare;
	TIM4->CCR3=compare;
	TIM4->CCR4=compare;
}

PWM轉DAC

發佈了14 篇原創文章 · 獲贊 3 · 訪問量 2433
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章