CSDN专栏嵌入式程序开发实战嵌入式双范式AI编程嵌入式开发必掌握嵌入式求职面试技术资料第34讲实战——PWM输出调速、控灯原型开发一、PWM基础PWM脉冲宽度调制是电机控制、LED调光、加热控制的核心技术。1.1 PWM参数基本参数频率决定PWM周期占空比决定输出功率分辨率占空比调节精度应用场景LED调光频率100Hz避免闪烁电机调速频率1-20kHz舵机控制频率50Hz占空比5-10%加热控制频率低占空比控制功率二、LED调光2.1 基础PWM输出Prompt生成STM32F103 PWM控制LED代码 - TIM2通道1PA0 - 频率1kHz - 功能调节LED亮度 - 使用HAL库AI生成#includestm32f1xx_hal.hTIM_HandleTypeDef htim2;voidPWM_Init(void){__HAL_RCC_TIM2_CLK_ENABLE();htim2.InstanceTIM2;htim2.Init.Prescaler72-1;// 1MHzhtim2.Init.CounterModeTIM_COUNTERMODE_UP;htim2.Init.Period1000-1;// 1kHzhtim2.Init.ClockDivisionTIM_CLOCKDIVISION_DIV1;HAL_TIM_PWM_Init(htim2);TIM_OC_InitTypeDef sConfigOC{0};sConfigOC.OCModeTIM_OCMODE_PWM1;sConfigOC.Pulse500;// 50%占空比sConfigOC.OCPolarityTIM_OCPOLARITY_HIGH;sConfigOC.OCFastModeTIM_OCFAST_DISABLE;HAL_TIM_PWM_ConfigChannel(htim2,sConfigOC,TIM_CHANNEL_1);HAL_TIM_PWM_Start(htim2,TIM_CHANNEL_1);}voidPWM_SetDuty(uint16_tduty){__HAL_TIM_SET_COMPARE(htim2,TIM_CHANNEL_1,duty);}intmain(void){HAL_Init();SystemClock_Config();PWM_Init();uint16_tduty0;while(1){PWM_SetDuty(duty);duty(duty10)%1000;// 呼吸灯效果HAL_Delay(10);}}2.2 呼吸灯效果代码voidLED_Breath(void){staticuint16_tduty0;staticuint8_tdirection0;// 0增1减if(direction0){duty5;if(duty1000){duty1000;direction1;}}else{duty-5;if(duty0){duty0;direction0;}}PWM_SetDuty(duty);}三、电机调速3.1 直流电机PWM控制Prompt生成STM32F103 直流电机PWM控制代码 - TIM3通道1PA6 - 频率10kHz - 功能调节电机速度 - 使用HAL库AI生成#defineMOTOR_FREQ10000// 10kHz#defineMOTOR_MAX1000// 最大占空比voidMotor_Init(void){__HAL_RCC_TIM3_CLK_ENABLE();htim3.InstanceTIM3;htim3.Init.Prescaler72-1;htim3.Init.CounterModeTIM_COUNTERMODE_UP;htim3.Init.Period1000000/MOTOR_FREQ-1;HAL_TIM_PWM_Init(htim3);TIM_OC_InitTypeDef sConfigOC{0};sConfigOC.OCModeTIM_OCMODE_PWM1;sConfigOC.Pulse0;sConfigOC.OCPolarityTIM_OCPOLARITY_HIGH;HAL_TIM_PWM_ConfigChannel(htim3,sConfigOC,TIM_CHANNEL_1);HAL_TIM_PWM_Start(htim3,TIM_CHANNEL_1);}voidMotor_SetSpeed(uint16_tspeed){if(speedMOTOR_MAX)speedMOTOR_MAX;__HAL_TIM_SET_COMPARE(htim3,TIM_CHANNEL_1,speed);}3.2 带方向控制的电机代码// 方向控制引脚#defineMOTOR_DIR_PIN1GPIO_PIN_0#defineMOTOR_DIR_PIN2GPIO_PIN_1#defineMOTOR_DIR_PORTGPIOBvoidMotor_Init_GPIO(void){__HAL_RCC_GPIOB_CLK_ENABLE();GPIO_InitTypeDef GPIO_InitStruct{0};GPIO_InitStruct.PinMOTOR_DIR_PIN1|MOTOR_DIR_PIN2;GPIO_InitStruct.ModeGPIO_MODE_OUTPUT_PP;GPIO_InitStruct.PullGPIO_NOPULL;GPIO_InitStruct.SpeedGPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(MOTOR_DIR_PORT,GPIO_InitStruct);}voidMotor_SetDirection(int8_tdirection){if(direction0){// 正转HAL_GPIO_WritePin(MOTOR_DIR_PORT,MOTOR_DIR_PIN1,GPIO_PIN_SET);HAL_GPIO_WritePin(MOTOR_DIR_PORT,MOTOR_DIR_PIN2,GPIO_PIN_RESET);}elseif(direction0){// 反转HAL_GPIO_WritePin(MOTOR_DIR_PORT,MOTOR_DIR_PIN1,GPIO_PIN_RESET);HAL_GPIO_WritePin(MOTOR_DIR_PORT,MOTOR_DIR_PIN2,GPIO_PIN_SET);}else{// 停止HAL_GPIO_WritePin(MOTOR_DIR_PORT,MOTOR_DIR_PIN1,GPIO_PIN_RESET);HAL_GPIO_WritePin(MOTOR_DIR_PORT,MOTOR_DIR_PIN2,GPIO_PIN_RESET);}}voidMotor_Run(int16_tspeed){if(speed0){Motor_SetDirection(1);Motor_SetSpeed(speed);}elseif(speed0){Motor_SetDirection(-1);Motor_SetSpeed(-speed);}else{Motor_SetDirection(0);Motor_SetSpeed(0);}}四、舵机控制4.1 舵机PWM特点- 频率50Hz周期20ms - 占空比5-10%对应0-180度 - 脉宽0.5ms-2.5ms代码#defineSERVO_FREQ50// 50Hz#defineSERVO_MIN500// 0.5ms0度#defineSERVO_MAX2500// 2.5ms180度voidServo_Init(void){htim4.InstanceTIM4;htim4.Init.Prescaler72-1;// 1MHzhtim4.Init.Period20000-1;// 20ms50HzHAL_TIM_PWM_Init(htim4);TIM_OC_InitTypeDef sConfigOC{0};sConfigOC.OCModeTIM_OCMODE_PWM1;sConfigOC.PulseSERVO_MIN;sConfigOC.OCPolarityTIM_OCPOLARITY_HIGH;HAL_TIM_PWM_ConfigChannel(htim4,sConfigOC,TIM_CHANNEL_1);HAL_TIM_PWM_Start(htim4,TIM_CHANNEL_1);}voidServo_SetAngle(uint8_tangle){if(angle180)angle180;// 计算脉宽uint16_tpulseSERVO_MIN(SERVO_MAX-SERVO_MIN)*angle/180;__HAL_TIM_SET_COMPARE(htim4,TIM_CHANNEL_1,pulse);}五、本讲核心要点5.1 记住这三句话PWM参数频率、占空比、分辨率不同应用不同要求LED调光频率100Hz占空比控制亮度电机控制频率1-20kHz占空比控制速度方向控制正反转5.2 下讲预告第35讲将深入讲解Vibe模式多轮对话管理外设单独迭代、互不干扰如何管理多轮对话避免外设迭代相互干扰下一讲将详细讲解。