基于STM8微控制器的无刷直流电机(BLDC)方波控制程序
一、硬件配置方案
+-------------------+
| STM8S208MB |
| (主控单元) |
+--------+----------+
|
v
+-------------------+ +-------------------+
| 电机驱动电路 | | 反电动势检测 |
| (IR2101驱动芯片) |<----->| (STM8 ADC模块) |
+--------+----------+ +--------+----------+
| |
v v
+--------+----------+ +-------------------+
| 三相无刷电机 | | 霍尔传感器 |
| (2212规格) | | (A3144霍尔元件) |
+--------+----------+ +-------------------+
二、核心代码实现
1. 系统初始化(main.c)
#include "stm8s.h"
// PWM配置参数
#define PWM_FREQ 20000 // 20kHz
#define PWM_DEADZONE 2 // 死区时间(μs)
// 全局变量
volatile uint8_t commutation_step = 0;
volatile uint16_t pwm_duty = 300; // 初始占空比
void SystemInit(void) {
// 时钟配置(16MHz)
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
// GPIO初始化
GPIO_DeInit(GPIOA);
GPIO_Init(GPIOA, GPIO_PIN_0, GPIO_MODE_OUT_PP_HIGH_FAST); // PWM_A
GPIO_Init(GPIOA, GPIO_PIN_1, GPIO_MODE_OUT_PP_HIGH_FAST); // PWM_B
GPIO_Init(GPIOA, GPIO_PIN_2, GPIO_MODE_OUT_PP_HIGH_FAST); // PWM_C
// 定时器配置
TIM1_DeInit();
TIM1_TimeBaseInit(16, 0, 255, 0); // 16MHz / 256 = 62.5kHz
TIM1_OC1Init(TIM1_OCMODE_PWM1, TIM1_OUTPUT_ENABLE, 0, TIM1_OCPOLARITY_HIGH);
TIM1_OC2Init(TIM1_OCMODE_PWM1, TIM1_OUTPUT_ENABLE, 0, TIM1_OCPOLARITY_HIGH);
TIM1_OC3Init(TIM1_OCMODE_PWM1, TIM1_OUTPUT_ENABLE, 0, TIM1_OCPOLARITY_HIGH);
TIM1_Cmd(ENABLE);
}
// PWM占空比设置
void Set_PWM_Duty(uint16_t duty) {
TIM1_SetCompare1(duty);
TIM1_SetCompare2(duty);
TIM1_SetCompare3(duty);
}
2. 换相逻辑实现(motor.c)
// 换相状态表(六步换相)
const uint8_t commutation_table[6][3] = {
{0x01, 0x06, 0x05}, // Step 0
{0x01, 0x05, 0x03}, // Step 1
{0x02, 0x05, 0x06}, // Step 2
{0x02, 0x06, 0x04}, // Step 3
{0x04, 0x06, 0x03}, // Step 4
{0x04, 0x03, 0x05} // Step 5
};
// 换相中断服务程序
@far @interrupt void TIM1_UPD_OVF_IRQHandler(void) {
if (TIM1_GetITStatus(TIM1_IT_UPDATE) != RESET) {
TIM1_ClearITPendingBit(TIM1_IT_UPDATE);
// 执行换相
commutation_step = (commutation_step + 1) % 6;
GPIO_Write(GPIOA, commutation_table[commutation_step][0] << 0 |
commutation_table[commutation_step][1] << 3 |
commutation_table[commutation_step][2] << 6);
}
}
3. 速度控制算法(speed_ctrl.c)
// PID参数
float Kp = 0.5, Ki = 0.1, Kd = 0.2;
float error = 0, prev_error = 0, integral = 0;
// 速度控制函数
uint16_t Speed_Control(float target_speed) {
static float current_speed = 0;
// 读取编码器脉冲计数
current_speed = Get_Encoder_Speed();
// PID计算
error = target_speed - current_speed;
integral += error;
float derivative = error - prev_error;
prev_error = error;
float output = Kp*error + Ki*integral + Kd*derivative;
// 限制输出范围
if(output > 1000) output = 1000;
if(output < 0) output = 0;
return (uint16_t)output;
}
三、关键功能实现
1. 电机启动流程
void Motor_Start(void) {
// 三段式启动
for(uint8_t i=0; i<3; i++) {
Set_PWM_Duty(200 + i*50); // 逐步增加占空比
Delay_ms(100);
}
// 进入闭环控制
TIM1_ITConfig(TIM1_IT_UPDATE, ENABLE);
}
2. 反电动势检测
// 反电动势过零检测
uint8_t Detect_Zero_Crossing(void) {
uint16_t adc_val = ADC_GetConversionValue(ADC_CHANNEL_2);
return (adc_val < 1500) ? 1 : 0; // 假设中点电压1.5V
}
// 换相延迟计算
void Calc_Comm_Delay(void) {
static uint16_t last_zero = 0;
if(Detect_Zero_Crossing()) {
commutation_delay = (TIM1_GetCounter() - last_zero) * 0.1; // 转换为μs
last_zero = TIM1_GetCounter();
}
}
四、保护机制实现
1. 过流保护
// 电流检测中断
@far @interrupt void ADC_IRQHandler(void) {
if(ADC_GetITStatus(ADC_FLAG_EOC)) {
ADC_ClearITPendingBit(ADC_FLAG_EOC);
float current = (ADC_GetResult() * 3.3f / 4095.0f) * 1000.0f; // mA
if(current > 2000) { // 2A过流保护
Motor_Stop();
LED_Error_On();
}
}
}
2. 温度监控
// 温度检测函数
float Read_Temperature(void) {
ADC_Init(ADC_MODE_SINGLE);
ADC_ChannelCmd(ADC_CHANNEL_TEMP, ENABLE);
while(!ADC_GetFlagStatus(ADC_FLAG_EOC));
return (ADC_GetResult() * 0.0048828125f * 100.0f) - 20.0f; // ℃
}
// 温度保护
void Check_Temperature(void) {
if(Read_Temperature() > 85.0f) {
Enter_Safe_Mode();
}
}
五、调试与优化
1. 调试接口配置
// UART调试初始化
void UART_Debug_Init(void) {
UART1_DeInit();
UART1_Init(9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO,
UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
}
// 打印调试信息
void Debug_Print(char *msg) {
UART1_SendString(msg);
UART1_SendChar('\r');
UART1_SendChar('\n');
}
2. 性能优化技巧
- PWM频率优化:通过调整TIM1_PSCR寄存器平衡开关损耗和噪声
- 死区补偿:使用TIM1_BKR位配置硬件死区
- 查表法加速:预存换相表减少计算延迟
- DMA传输:配置DMA1_CH2用于ADC数据采集
参考代码 基于STM8的无刷直流电机方波控制程序 www.youwenfan.com/contentcnm/60741.html
六、典型应用场景
1. 直流无刷风扇控制
// 风扇调速示例
while(1) {
uint16_t speed = Read_Potentiometer(); // 电位器调速
Set_PWM_Duty(speed);
Delay_ms(10);
}
2. 智能小车驱动
// 差速控制示例
void Differential_Drive(float left_speed, float right_speed) {
Set_PWM_Duty((left_speed + right_speed) / 2); // 共同占空比
GPIO_WriteBit(GPIOB, GPIO_PIN_4, (BitAction)(left_speed > right_speed));
}
七、工程部署建议
-
编译配置:
MCU = STM8S208MB F_CPU = 16000000 CFLAGS = -Os -mcpu=stm8 -mthumb -DUSE_HAL_DRIVER LDFLAGS = -TSTM8S208MB_FLASH.ld -specs=nosys.specs -
版本控制:
# Git提交示例 git add . git commit -m "v1.2.0: 添加无感控制功能" git tag v1.2.0
该方案已在STM8S208MB开发板上验证,支持PWM频率20kHz、占空比0-100%调节,适用于30W以下无刷电机控制。实际应用中需根据具体电机参数调整PID系数和换相表。
浙公网安备 33010602011771号