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

发布了10 篇原创文章 · 获赞 2 · 访问量 319

猜你喜欢

转载自blog.csdn.net/weixin_43482414/article/details/103811246