【STM32Cube HAL】PWM输出(五)

   实验内容:使用通用定时器输出PWM,实现呼吸灯效果,呼吸周期3S。

一、原理图

 二、 CubeMX配置

Step1.打开 STM32CubeMX,点击“New Project”,选择芯片型号,STM32F103VETx。

 Step2.选择时钟源,并配置时钟树。选择Crystal/Ceramic Resonator,并配置系统时钟为72M。

  

Step3.配置SYS,我们这里选择的是Serial Wire。(正常情况配置不配置不影响,debug可以使用。但是你不可以把这两个引脚用于其他复用功能,如果用于其他复用功能,debug就不起作用了。)

 

Step4.配置定时器,时钟配置计数器时钟经过(719+1)分频配置为100khz,即计一个数的时间为10us,一共计数(299+1)次,即进入一次中断的时间为3ms。(注:图中计数周期应改为299

 

 到这里关于相关参数配置基本已经完成,只需要根据之前文章《STM32Cube HAL:GPIO输入/输出(一)》Step4-Step8,设置相关工程参数和生成代码。

三、添加功能代码

我们此次采用的查表法进行占空比的修改,我这边是用excel生成了一个呼吸曲线。(采样点为100个)

 在main.c主函数外定义相关变量:

uint16_t int_cnt;//中断的次数
uint16_t duty_cnt;//不同占空比在数组的位置
uint16_t duty_value[100]={1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 7, 8, 9, 10, 
						12, 13,15, 16, 18, 21, 23, 26, 29, 33, 37, 41, 47, 52, 59, 66, 74, 											 
	                    83,94, 105, 118, 133, 149, 168, 188, 212, 238, 267, 300, 300, 267,
						 238, 212, 188, 168, 149, 133, 118, 105, 94, 83, 74, 66,59, 52, 47,
						 41, 37, 33, 29, 26, 23, 21, 18, 16, 15, 13, 12, 10, 9, 8, 7, 6, 6,
						 5, 5, 4, 4, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1};//占空比的取值(采样点)

在main.c,主函数内(while(1)循环外)开启定时器,使能更新中断和PWM输出。

__HAL_TIM_CLEAR_IT(&htim3,TIM_IT_UPDATE);//清除中断标志位,防止一使能定时器就进入中断
HAL_TIM_Base_Start_IT(&htim3);//使能定时器,和更新中断
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_4);//使能定时器,和PWM输出

 在main.c文件中,写入回调函数:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    //每进入一次中断,int_cnt加1
	int_cnt++;
    //int_cnt=10,说明进入10次中断,变换占空比
	if(int_cnt==10)
	{
        //从duty_value[0]到duty_value[99]共100个数
		__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4,duty_value[duty_cnt]);//用于变换占空比
		//通过自加,来变换占空比
        duty_cnt++;
        //表中共100位数,使用完以后重新从第一位数开始
		if(duty_cnt==100)
		{
			duty_cnt=0;
		}
        //每十次中断以后,中断重新计数
		int_cnt=0;
	}
}

 结合时钟配置以及回调函数我们可以知道,我们每进入一次中断的时间为3ms,而每进入十次中断就会变换一次占空比,即每变换一次占空比耗时30ms。我们一共需要变换100次占空比,即一次呼吸灯耗时3s。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32CubeMX中配置PWM有以下步骤: 1. 打开STM32CubeMX软件,选择你的MCU型号。 2. 进入Pinout & Configuration选项卡,选择你需要使用的PWM通道引脚并打开它们的复用功能。 3. 进入Clock Configuration选项卡,选择你需要使用的定时器时钟源,并设置定时器时钟频率。 4. 进入Configuration选项卡,选择你需要使用的定时器,并启用PWM模式。 5. 配置PWM的周期和占空比。 6. 生成代码并导入到你的工程中。 下面是一个使用TIM2的PWM配置示例: 1. 进入Pinout & Configuration选项卡,选择PB3引脚并将其设置为TIM2_CH2的复用功能。 2. 进入Clock Configuration选项卡,选择TIM2的时钟源为内部时钟,设置时钟频率为84MHz。 3. 进入Configuration选项卡,选择TIM2,并启用PWM模式。 4. 在TIM2的PWM设置中,设置周期为20000(对应20ms),占空比为50%。 5. 生成代码并导入到你的工程中,然后在main函数中初始化TIM2并启动它。 下面是一个使用HAL库的PWM配置示例代码: ```c TIM_HandleTypeDef htim2; void PWM_Init(void) { TIM_OC_InitTypeDef sConfigOC; htim2.Instance = TIM2; htim2.Init.Prescaler = 840-1; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 20000-1; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Init(&htim2); sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 10000-1; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2); HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2); } ``` 在上述代码中,首先通过HAL_TIM_PWM_Init函数初始化TIM2,并设置预分频器、计数模式、周期和时钟分频系数。然后通过HAL_TIM_PWM_ConfigChannel函数配置TIM2的PWM通道2,设置PWM模式、占空比、极性和快速模式。最后通过HAL_TIM_PWM_Start函数启动TIM2的PWM通道2,使其开始输出PWM波形。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值