基于SONIX SN8P2711AS/BS单片机的交流电机可控硅控制
一、硬件设计
1. 电路原理图关键部分
MCU: SN8P2711AS/BS
├─ PWM0 → 光耦隔离电路 → 可控硅触发极
├─ PWM1 → 频率检测电路(可选)
├─ INT0 → 零点检测输入
├─ P0.0 → 按键输入(调速控制)
└─ P4.0 → 电流检测ADC输入
外围电路:
- 可控硅驱动:MOC3023光耦 + BTA16可控硅
- 零点检测:PC817光耦 + 10kΩ分压电阻
- 电流检测:ACS712霍尔传感器 + 100Ω采样电阻
二、软件实现
1. PWM初始化(16位双通道)
// PWM配置(4MHz系统时钟,频率2kHz)
void PWM_Init() {
TMOD |= 0x22; // T0/T1工作在模式2
TH0 = 0xFC; // 1ms定时基准
TL0 = 0x66;
ET0 = 1; // 使能T0中断
EA = 1; // 总中断使能
PWM0CON = 0x80; // PWM0使能,模式A
PWM0PRD = 2000-1; // 周期寄存器
PWM0DUTY = 500; // 初始占空比50%
PWM1CON = 0x80; // PWM1使能,模式B
PWM1PRD = 1000-1; // 高频载波
PWM1DUTY = 0; // 初始关闭
}
// PWM中断服务
void PWM_ISR() interrupt 1 {
PWM0CON |= 0x10; // 触发通道0更新
PWM1CON |= 0x10; // 触发通道1更新
}
2. 可控硅触发控制
// 零点检测中断
void INT0_ISR() interrupt 0 {
static uint16_t phase = 0;
if(++phase >= 180) phase = 0; // 0-180°范围
// 根据调速值计算导通角
uint16_t duty = (speed_val * 180) / 100;
// 设置PWM占空比
PWM0DUTY = (phase + duty) % 180;
}
// 电流保护中断
void ADC_ISR() {
uint16_t adc_val = ADC_GetValue(4); // P4.0通道
if(adc_val > 3000) { // 超过3A阈值
PWM0DUTY = 0; // 立即关闭输出
FLAG_OVERLOAD = 1;
}
}
三、电机控制算法
1. PID调速实现
float Kp=2.5, Ki=0.3, Kd=0.1;
uint16_t prev_error = 0;
void Speed_Control() {
uint16_t target = Get_Target_Speed(); // 获取目标速度
uint16_t actual = Get_Actual_Speed(); // 编码器测速
float error = target - actual;
integral += error;
float derivative = error - prev_error;
int16_t output = Kp*error + Ki*integral + Kd*derivative;
prev_error = error;
// 限制输出范围
if(output > 100) output = 100;
if(output < -100) output = -100;
// 方向控制
if(output > 0) {
DIR_PIN = 1; // 正转
PWM0DUTY = (output * 50) + 50; // 50-100%占空比
} else {
DIR_PIN = 0; // 反转
PWM0DUTY = (-output * 50) + 50; // 50-100%占空比
}
}
四、完整主程序框架
void main() {
System_Init(); // 系统时钟初始化
PWM_Init(); // PWM模块初始化
ADC_Init(4, 12); // 配置ADC通道4为12位
INT0_Init(); // 零点检测中断
while(1) {
Read_Key(); // 按键扫描
Speed_Control(); // 执行调速算法
Check_Overload();// 过流检测
LED_Display(); // 状态指示
}
}
五、调试与优化
1. 关键调试参数
| 参数 | 推荐值 | 调试方法 |
|---|---|---|
| PWM频率 | 2kHz | 示波器观察波形 |
| 零点延迟 | 1.5ms | 逻辑分析仪检测INT0触发 |
| 电流采样率 | 1kHz | 万用表对比实际电流 |
| 死区时间 | 2μs | 示波器测量可控硅导通间隔 |
2. 常见问题解决
- 电机抖动:检查零点检测电路(示波器观察INT0信号)
- 过热保护误触发:校准电流检测电路(使用标准负载测试)
- PWM占空比异常:验证定时器配置(检查PRD寄存器值)
参考代码 SONIX的单片机SN8P2711AS/BS交流电机控制可控硅方案源码 www.youwenfan.com/contentcnm/72026.html
六、参考电路图
+-------------------+
| |
| SN8P2711AS/BS |
| |
+5V -----------|VDD |
GND -----------|VSS |
PWM0 --------->|P0.0 (光耦驱动) |
PWM1 --------->|P0.1 (频率检测)|
INT0 <---------|P3.2 (零点检测)|
ADC4 <-------->|P4.0 (电流采样)|
| |
+-------------------+
|
+-----|-----+
| 驱动电路 |
| (MOC3023) |
+-----|-----+
|
+-----|-----+
| 可控硅模块 |
| (BTA16) |
+-------------+
七、开发建议
- 开发环境:推荐使用Keil C51 + STC-ISP工具链
- 调试技巧: 使用逻辑分析仪捕获PWM波形 通过串口打印关键变量值 利用看门狗定时器防止程序跑飞
- 代码优化: 使用查表法加速三角函数计算 采用DMA方式处理ADC数据 关闭未使用的外设时钟
浙公网安备 33010602011771号