电机应用控制之代码讲解一

//代码块一
uint8_t uemf_edge(uint8_t val)
{
    /* 主要是检测val信号从0 - 1 在从 1 - 0的过程,即高电平所持续的过程 */
    static uint8_t oldval=0;
    if(oldval != val)
    {
        oldval = val;
        if(val == 0) return 0;
        else return 1;
    }
    return 2;
}

 g_bldc_motor1.hall_sta_edge = uemf_edge(g_bldc_motor1.hall_single_sta);/* 检测单个霍尔信号的变化 */

上面这句代码是对代码块一的调用,那么运行的流程是怎样的呢?

首先我们了解这个变量是 hall_single_sta;/* 单个霍尔状态 */,在uint32_t hallsensor_get_state(uint8_t motor_id); 这个函数中有说明,hall_single_sta的值为1或0;当hall_single_sta为1时检测到霍尔状态,为0为未检测到霍尔状态,说明一下使用的是霍尔3;

假如开始时是低电平,hall_single_sta为0,调用代码块一,返回值为2,运行下述代码,实际情况应该就是电机没有转动(时间很久),要么就是在等待计数结束;

 if(g_bldc_motor1.hall_sta_edge == 2)    /* 霍尔值一直不变代表未换向 */
            {
                g_bldc_motor1.no_single++;          /* 不换相时间累计 超时则判定速度为0 */
                
                if(g_bldc_motor1.no_single > 15000)
                {
                    
                    g_bldc_motor1.no_single = 0;
                    g_bldc_motor1.speed = 0;        /* 超时换向 判定为停止 速度为0 */
                }

然后等啊等,咔。运行到这里,检测到高电平,hall_single_sta为1,调用代码块一,返回结果为1,此时oldval也为1,

运行下述代码;将计数值清0,每次计数值清0,为了使计数值准确无误;

  if(g_bldc_motor1.hall_sta_edge == 1)    /* 当采集到下降沿时数据清0 */
            {
                g_bldc_motor1.no_single = 0;
                g_bldc_motor1.count_j = 0;
            }

 然后继续运行代码,来到这里,此时和第一步差不多;

再继续运行,来到这里,hall_single_sta为0,调用代码块一,返回值为1;运行下述代码;这就是计算速度的代码部分了;

 

if(g_bldc_motor1.hall_sta_edge == 0)    /* 统计单个霍尔信号的高电平时间,当只有一对级的时候,旋转一圈为一个完整脉冲。一高一低相加即旋转一圈所花的时间*/
            {
                /*计算速度*/
                if(g_bldc_motor1.dir == CW)
                    temp_speed = (SPEED_COEFF/g_bldc_motor1.count_j);
                else
                    temp_speed = -(SPEED_COEFF/g_bldc_motor1.count_j);
                FirstOrderRC_LPF(g_bldc_motor1.speed,temp_speed,0.2379f);   /* 一阶滤波 */
                g_bldc_motor1.no_single = 0;
                g_bldc_motor1.count_j = 0;
            }

 以上内容来自【正点原子】手把手教你学STM32电机应用控制;

65-直流无刷电机专题-第10讲 无刷有感速度闭环代码解析_哔哩哔哩_bilibili

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值