简介
在本章节中我们将根据刘工的视频演示来使用STM32CUBE MX结合STM32CUBEIDE快速的初始化PWM以及输出PWM波形从而通过不同的占空比配置来控制LED灯的亮度。之后将使用示波器对输出进行验证。
1- 项目导入, 首先我们使用stm32CUBE IDE导入官方提供的P2P-server的项目。
2- STM32CUBEMX 配置定时器和PWM输出
在电脑上已经安装好CUBEMX的前提下打开这个CUBEMX工程。
3- 配置PWM和定时器输出
在TIMER2 通道4 处使能PWM输出, 当我们配置完这个输出之后我们可以看到右侧的Pinout的overview 已经被配置到了TIM2通道4.
4- PWM参数配置。
根据上图配置, 使用的HSI作为系统时钟(未使用HSE), 之后经过一系列的分频和倍频等。在APB1 和APB2 总线上的定时器主频都为16MHZ。
之后我们需要配置PWM的相关配置。
STM32 定时器的分频器寄存器(PSC)的值表示的分频因子是 (PSC + 1)。也就是说:
如果 PSC 设置为 0,则分频因子为 1,表示不分频。
如果 PSC 设置为 1,则分频因子为 2。
如果 PSC 设置为 xx,则分频因子为 xx + 1。
因此,当目标分频因子为 xx 时,PSC 的值需要配置为 xx - 1。
所以PSC设置为16。根据PWM的频率计算公式我们可以根据上述参数来计算出PWM的实际频率。 即Frequence (pwm) = Frequence(Sys) / (PSC + 1) * (APR + 1) 即结果为1K。 所以PWM的频率为1KHZ。
占空比的实际计算可以通过Pulse / Counter 所以上图默认的占空比为50%。
之后我们点击生成代码, 在Main.c中进行测试。
5- 测试(测试代码如下)
int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* Config code for STM32_WPAN (HSE Tuning must be done before system clock configuration) */ MX_APPE_Config(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* Configure the peripherals common clocks */ PeriphCommonClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_GPDMA1_Init(); MX_RAMCFG_Init(); MX_RTC_Init(); MX_RNG_Init(); MX_ICACHE_Init(); MX_TIM2_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Init code for STM32_WPAN */ MX_APPE_Init(NULL); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, 100); // 设置占空比 HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_4); // 启动PWM输出 /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ MX_APPE_Process(); /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }
在上述代码中我们手动修改占空比为 10 % ,即 100 / 1000. 同时我们需要使能PWM输出。根据原理图得知PA6的Pin 对应Arduino接口的A1.
因此我们可以硬件按照以下接线。
烧录代码, 观察示波器的波形。
如上图所示, 占空比为10%, 频率为1Khz 和期望的实验结果相符。 之后我们便可以通过蓝牙设备等来动态的调整占空比信息。来改变LED的亮度。 如下图所示,占空比为90%。
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, 900); // 设置占空比