【STM32】(8) PWM输出实验

一、实验目的

使用定时器PWM功能,输出占空比可变的PWM波用来驱动LED灯,从而达到LED亮度由暗变亮,又从亮变暗,如此循环。

二、代码及分析

#include "timer.h"

TIM_HandleTypeDef  TIM3_Handler;      // 定时器3PWM句柄
TIM_OC_InitTypeDef TIM3_CH4Handler;   //定时器3通道4句柄

void TIM_PWM_Init(u16 psc,u16 arr)
{
    TIM3_Handler.Instance = TIM3;
    TIM3_Handler.Init.Prescaler = psc;
	TIM3_Handler.Init.CounterMode = TIM_COUNTERMODE_UP;
	TIM3_Handler.Init.Period= arr;
	TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
	HAL_TIM_PWM_Init(&TIM3_Handler);
	// 以上为初始化PWM时基参数
	// 配置TIM3通道4
	TIM3_CH4Handler.OCMode = TIM_OCMODE_COMBINED_PWM1;
	TIM3_CH4Handler.Pulse = arr/2;
	TIM3_CH4Handler.OCPolarity=TIM_OCNPOLARITY_LOW;
	
	HAL_TIM_PWM_ConfigChannel(&TIM3_Handler,&TIM3_CH4Handler,TIM_CHANNEL_4);
	
	HAL_TIM_PWM_Start(&TIM3_Handler, TIM_CHANNEL_4); //开启PWM通道4

}
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==TIM3)
	{
	GPIO_InitTypeDef GPIO_Initure;
     __HAL_RCC_TIM3_CLK_ENABLE();
     __HAL_RCC_GPIOB_CLK_ENABLE();
	
	
	
	GPIO_Initure.Pin=GPIO_PIN_1;			//PB1
	GPIO_Initure.Mode=GPIO_MODE_AF_PP;		//复用推挽输出
	GPIO_Initure.Pull=GPIO_PULLUP;			//上拉
	GPIO_Initure.Speed=GPIO_SPEED_FAST;		//高速
	GPIO_Initure.Alternate=GPIO_AF2_TIM3;	//复用为TIM3_CH4
	HAL_GPIO_Init(GPIOB,&GPIO_Initure);	   	//初始化PB1
	}
	
}

//设置TIM3通道4的占空比
//compare :比较值

void TIM3_Setcompare4(u32 compare)
	
{
  TIM3->CCR4 = compare;
}


int main(void)
{
    u8 dir =1;
	u16 led0pwmval =0;
    Cache_Enable();                 //打开L1-Cache
    HAL_Init();				        //初始化HAL库
    Stm32_Clock_Init(432,25,2,9);   //设置时钟,216Mhz 
    delay_init(216);                //延时初始化
	uart_init(115200);		        //串口初始化
    LED_Init();                     //初始化LED
    TIM_PWM_Init( 108-1,50-1) ;   // PWM频率为20K HZ
    while(1)
    {
	  delay_ms(10);	 	
		if(dir)led0pwmval++;			//dir==1 led0pwmval递增
		else led0pwmval--;				//dir==0 led0pwmval递减 
		if(led0pwmval>30)dir=0;			//led0pwmval到达30后,方向为递减
		if(led0pwmval==0)dir=1;			//led0pwmval递减到0后,方向改为递增
		TIM3_Setcompare4(led0pwmval);	//修改比较值,修改占空比	
		
	}
}

(1)首先,自己定义一个 TIM_PWM_Init(u16 psc,u16 arr)函数,来调用HAL_TIM_PWM_Init(&TIM3_Handler);
    来初始化PWM时基参数 ,包括自动重装载值arr、定时器分频数psc、计数模式等 。调用HAL_TIM_PWM_ConfigChannel()来进行PWM的通道设置。它的第二次参数用来设置PWM的输出模式、极性、比较值等参数。调用HAL_TIM_PWM_Start(&TIM3_Handler, TIM_CHANNEL_4) 来使能定时器TIM3、使能能定时器TIM3的CH4输出。

(2)在回调函数HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)中,开启定时器时钟和GPIOB时钟、并把PB1复用为TIM3_CH4输出。
(3)设置TIM3通道4的占空比函数 TIM3_Setcompare4(u32 compare)

(4)在while循环中,dir =1,规定灯为暗, led0pwmval递增,占空比增大,灯由暗变亮。等到30时, led0pwmval递减,占空比减小,灯由亮变暗。如此循环。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值