基于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)    |
               +-------------+

七、开发建议

  1. 开发环境:推荐使用Keil C51 + STC-ISP工具链
  2. 调试技巧: 使用逻辑分析仪捕获PWM波形 通过串口打印关键变量值 利用看门狗定时器防止程序跑飞
  3. 代码优化: 使用查表法加速三角函数计算 采用DMA方式处理ADC数据 关闭未使用的外设时钟
posted @ 2025-12-02 16:54  别说我的眼泪有点咸  阅读(0)  评论(0)    收藏  举报