//代码块一
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电机应用控制;