1、两种安装方式:
从电机出轴方向看去,电机轴逆时针转动,霍尔信号的序列为
编码器信号的序列为:
以120°放置霍尔为例
如不给电机加电,使用示波器测量三个霍尔信号和电机三相反电动势,
按照上面所说的方向用手转动电机得到下图
霍尔传感器就是根据这六种状态确定转子的位置,加上这6种状态的循环次数就是当前电机转子的真实位置:(由于只有3个霍尔传感器,最小的分辨角度也只是30度)
2、扇区判定
这个比较好理解,一看输出波形就知道,4-6-2-3-1-5,这数字这么熟悉,扇区号自然不是问题,只是在未上电时,手动转转电机就更好理解了。
若是60度安装的,会有0和7,若是120度装的,没有这两个,稍微注意下就好。
下面是一个大概的代码流程:
// 定义Hall传感器引脚
#define HALL_PIN_A 2
#define HALL_PIN_B 3
#define HALL_PIN_C 4
// 定义PWM输出引脚
#define PWM_PIN 5
// 定义Hall传感器状态
enum HallState {
HALL_STATE_1 = 1,
HALL_STATE_2,
HALL_STATE_3,
HALL_STATE_4,
HALL_STATE_5,
HALL_STATE_6
};
// 初始化Hall传感器引脚
void setup() {
pinMode(HALL_PIN_A, INPUT);
pinMode(HALL_PIN_B, INPUT);
pinMode(HALL_PIN_C, INPUT);
pinMode(PWM_PIN, OUTPUT);
}
// 循环读取Hall传感器状态,并控制PWM输出
void loop() {
// 读取Hall传感器状态
int hallState = readHallState();
// 根据Hall传感器状态设置PWM输出
switch (hallState) {
case HALL_STATE_1:
analogWrite(PWM_PIN, 0);
break;
case HALL_STATE_2:
analogWrite(PWM_PIN, 128);
break;
case HALL_STATE_3:
analogWrite(PWM_PIN, 255);
break;
case HALL_STATE_4:
analogWrite(PWM_PIN, 0);
break;
case HALL_STATE_5:
analogWrite(PWM_PIN, 128);
break;
case HALL_STATE_6:
analogWrite(PWM_PIN, 255);
break;
}
}
// 读取Hall传感器状态
int readHallState() {
int hallState = 0;
int hallA = digitalRead(HALL_PIN_A);
int hallB = digitalRead(HALL_PIN_B);
int hallC = digitalRead(HALL_PIN_C);
if (hallA == HIGH && hallB == LOW && hallC == LOW) {
hallState = HALL_STATE_1;
}
else if (hallA == HIGH && hallB == LOW && hallC == HIGH) {
hallState = HALL_STATE_2;
}
else if (hallA == LOW && hallB == LOW && hallC == HIGH) {
hallState = HALL_STATE_3;
}
else if (hallA == LOW && hallB == HIGH && hallC == HIGH) {
hallState = HALL_STATE_4;
}
else if (hallA == LOW && hallB == HIGH && hallC == LOW) {
hallState = HALL_STATE_5;
}
else if (hallA == HIGH && hallB == HIGH && hallC == LOW) {
hallState = HALL_STATE_6;
}
return hallState;
}
3、角度判定
目前为止,到扇区级,已经可以控制到60度范围内了。
一个扇区的60度之内如何确定精确角度?显然纯靠霍尔传感器已经没招了,这里采用一种叫插补的方法来估算角度,意思就是在一个扇区内,按照SVPWM的开关频率分成N份,每隔一个PWM周期,就认为走了一份角度。用专业的术语来表达,就是速度对时间积分。
描述:
S = V t
公式的意思:距离(0度到当前角度)= 速度(平均角速度) t (时间)
用这么个办法一直计算下去,会有累积误差,为了降低累积误差的影响,所以每个扇区都重新校准一下,也就是用霍尔传感器的边沿(换扇区的时刻,这个是肯定准确的)对应的角度重新标定一下当前的角度。