简介
在本章节中我们将根据刘工的视频演示来使用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); // 设置占空比

我要赚赏金
