定时器
在STM32中,定时器是一种非常重要的外设,用于在特定时间间隔内生成定时中断或者进行定时计数。它可以用于许多应用,比如控制系统中的精确时间测量、PWM波形生成、定时采样等。在STM32中,定时器通常包括基本定时器(TIM6和TIM7)、通用定时器(TIM2至TIM5)、高级定时器(TIM1)等类型。这些定时器可以根据具体的需求配置为不同的工作模式,比如定时模式、脉冲计数模式、输入捕获模式等。
定时器的工作原理是通过内部的计数器和预分频器来产生定时中断或者输出特定的脉冲信号。用户可以根据需要配置定时器的时钟源、预分频系数、自动重装载寄存器的值等参数,以实现不同的定时功能。此外,定时器还可以与其他外设模块(比如ADC、DAC等)进行联动,实现更复杂的功能。
在STM32中,定时器的使用需要用户熟悉寄存器的配置和控制,以及中断的处理。用户需要了解定时器的工作原理和各种工作模式的特点,以便正确地配置和使用定时器。
PWM
在STM32中,PWM是脉冲宽度调制(Pulse Width Modulation)的缩写。PWM是一种用于控制模拟电路的数字技术,它通过改变信号的脉冲宽度来实现对电路的控制。在STM32中,PWM通常用于控制电机、LED灯、音频设备等,以及模拟信号的数字化处理。
优点:
- 精确控制: PWM信号可以精确地控制输出设备的电压或功率,使得在不同的应用中可以实现精确的控制。
- 数字化处理: 由于PWM是一种数字技术,因此可以很容易地与数字系统集成,实现数字化处理和控制。
- 节能: 通过调整脉冲宽度,可以实现对电路的节能控制,从而提高效率。
缺点:
- 电磁干扰: PWM信号可能会产生电磁干扰,对周围的电子设备造成影响,需要进行相应的屏蔽和滤波处理。
- 噪音: 在一些应用中,PWM信号可能会产生听得见的噪音,这需要在设计中进行考虑和处理。
在STM32中,PWM可以通过配置定时器和通用IO口来实现。用户可以根据具体的应用需求,配置定时器的工作模式、频率、占空比等参数,以实现对外部设备的精确控制。同时,STM32还提供了丰富的开发工具和文档,帮助开发者更好地理解和应用PWM技术。
定时器控制LED周期性亮灭
首先,我们打开STM32CubeMX,新建一个项目;
在搜索栏搜索STM32F103C8T6,选择需要的芯片,点击StartProject;
点击System Core,点击SYS,将Debug选为Serial Wire;
然后点击RCC,将High Speed Clock选为Crystal;
配置IO口,鼠标左键点击 PA5 作为 LED 灯的阴极输入,将其设置为 GPIO-Output;
点击Timers,点击TIM2,将Clock Source选为internal Clock,将下面的Prescaler改为4999,Counter Period改为6399,auto-reload prelaod改为Enable;
因为定时器溢出时间:
Tout=((arr+1)*(psc+1))/Tclk
而这里我们将arr设置为4999,psc设置为6399,Tclk=16MHz,所以Tout=(5000*6400)/16us=2s;
然后设置项目名称和保存路径,将IDE改为MDK-ARM;
然后在Keil的main中添加以下代码:
HAL_TIM_Base_Start_IT(&htim2);
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static unsigned char ledState = 0;
if (htim == (&htim2))
{
if (ledState == 0)
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
else
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
ledState = !ledState;
}
}
定时器PWM模式LED呼吸灯渐亮渐灭
如同上面步骤,我们先创建一个新项目;
这次我们选择TIM3;
Keil编写程序:
/* USER CODE BEGIN 1 */
uint16_t pwmVal=0; //PWM占空比
uint8_t dir=1;
/* USER CODE END 1 */
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
/* USER CODE END 2 */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
while (pwmVal< 500)
{
pwmVal++;
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal); //修改比较值,修改占空比
// TIM3->CCR1 = pwmVal; 与上方相同
HAL_Delay(1);
}
while (pwmVal)
{
pwmVal--;
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal); //修改比较值,修改占空比
// TIM3->CCR1 = pwmVal; 与上方相同
HAL_Delay(1);
}
HAL_Delay(200);
}
/* USER CODE END 3 */
小结:
在连接LED和其他外设时,要确保电源和电路设计是正确和安全的。特别是在使用PWM控制LED亮度时,要注意电流和电压的要求,以避免损坏电路或外设。在完成实验后,要对实验结果进行评估和分析。检查LED的亮灭和呼吸灯效果是否符合预期。如果有任何不足或改进的地方,可以记录下来并思考如何进一步优化实验结果。