本帖最后由 聪聪哥哥 于 2025-5-23 16:29 编辑
在之前的测评帖子可以发现,STM32C092只有一个高级定时器,本次对高级定时器的进行一个简单的测试;
PWM(Pulse Width Modulation 脉宽调制)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。它是一种对模拟信号电平进行数字编码的方法。是指在一定时间内波形的高电平(即 1 状态)所占用的时间比例。
通过高分辨率计数器的使用,方波占空比被调制用来对一个模拟信号的电平进行编码。PWM 信号任然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有,要么完全无。比如我们的电压输出是 5V的,那么经过改变 PWM 的占空比,可以达到在一定时间内输出 3.3V 或者 1.3V 的效果。
这里我们对定时器输出脉冲的频率进行一个简单的测试
PWM是脉冲宽度调制,具有两个非常重要的参数:频率和占空比。
频率:PWM的频率是整个周期的倒数。
占空比:占空比是指一个周期内高电平所占的比例。
一:STM32 cube MX 软件的配置
1.1 配置定时器1的基本参数
1.2 设置定时器1的分频系数和重装值
1.3 使能定时器1的中断,并设置其优先级别
二:程序编写:
2.1 定时器的初始化部分:
<blockquote>void MX_TIM1_Init(void)
2.2 在主程序下增加定时器输出脉冲的控制函数
HAL_UARTEx_ReceiveToIdle_DMA(&huart2, RecBuffer2, 256);
__HAL_DMA_DISABLE_IT(&hdma_usart2_rx, DMA_IT_HT); // 手动关闭DMA_IT_HT中断
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
2.3 使用之前的按键中断按键,增加对频率的输出控制
int pressCount = 0;
void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_13)
{
// HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
// HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_9);
pressCount ++ ;
if(pressCount%2 == 0)
{
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
}
else
HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_1);
}
}
2.4 更改频率函数如下:
void UpdataFreData(int value)
{
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
htim1.Instance = TIM1;
htim1.Init.Prescaler = 47;
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = value;
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
if (HAL_TIM_OC_Init(&htim1) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = htim1.Init.Period/2;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_OC_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
}
可以定时器中调用该函数,对输出不同的频率。
三:实物验证过程如下:
gif图如下:
|