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 (时间)
用这么个办法一直计算下去,会有累积误差,为了降低累积误差的影响,所以每个扇区都重新校准一下,也就是用霍尔传感器的边沿(换扇区的时刻,这个是肯定准确的)对应的角度重新标定一下当前的角度。
