1、两种安装方式:

从电机出轴方向看去,电机轴逆时针转动霍尔信号的序列
image.png
编码器信号的序列为:
image.png
以120°放置霍尔为例
如不给电机加电,使用示波器测量三个霍尔信号和电机三相反电动势,
按照上面所说的方向用手转动电机得到下图
image.png
霍尔传感器就是根据这六种状态确定转子的位置,加上这6种状态的循环次数就是当前电机转子的真实位置:(由于只有3个霍尔传感器,最小的分辨角度也只是30度)
image.png

2、扇区判定

这个比较好理解,一看输出波形就知道,4-6-2-3-1-5,这数字这么熟悉,扇区号自然不是问题,只是在未上电时,手动转转电机就更好理解了。
电机有感控制-霍尔传感器 - 图5
若是60度安装的,会有0和7,若是120度装的,没有这两个,稍微注意下就好。
下面是一个大概的代码流程:

  1. // 定义Hall传感器引脚
  2. #define HALL_PIN_A 2
  3. #define HALL_PIN_B 3
  4. #define HALL_PIN_C 4
  5. // 定义PWM输出引脚
  6. #define PWM_PIN 5
  7. // 定义Hall传感器状态
  8. enum HallState {
  9. HALL_STATE_1 = 1,
  10. HALL_STATE_2,
  11. HALL_STATE_3,
  12. HALL_STATE_4,
  13. HALL_STATE_5,
  14. HALL_STATE_6
  15. };
  16. // 初始化Hall传感器引脚
  17. void setup() {
  18. pinMode(HALL_PIN_A, INPUT);
  19. pinMode(HALL_PIN_B, INPUT);
  20. pinMode(HALL_PIN_C, INPUT);
  21. pinMode(PWM_PIN, OUTPUT);
  22. }
  23. // 循环读取Hall传感器状态,并控制PWM输出
  24. void loop() {
  25. // 读取Hall传感器状态
  26. int hallState = readHallState();
  27. // 根据Hall传感器状态设置PWM输出
  28. switch (hallState) {
  29. case HALL_STATE_1:
  30. analogWrite(PWM_PIN, 0);
  31. break;
  32. case HALL_STATE_2:
  33. analogWrite(PWM_PIN, 128);
  34. break;
  35. case HALL_STATE_3:
  36. analogWrite(PWM_PIN, 255);
  37. break;
  38. case HALL_STATE_4:
  39. analogWrite(PWM_PIN, 0);
  40. break;
  41. case HALL_STATE_5:
  42. analogWrite(PWM_PIN, 128);
  43. break;
  44. case HALL_STATE_6:
  45. analogWrite(PWM_PIN, 255);
  46. break;
  47. }
  48. }
  49. // 读取Hall传感器状态
  50. int readHallState() {
  51. int hallState = 0;
  52. int hallA = digitalRead(HALL_PIN_A);
  53. int hallB = digitalRead(HALL_PIN_B);
  54. int hallC = digitalRead(HALL_PIN_C);
  55. if (hallA == HIGH && hallB == LOW && hallC == LOW) {
  56. hallState = HALL_STATE_1;
  57. }
  58. else if (hallA == HIGH && hallB == LOW && hallC == HIGH) {
  59. hallState = HALL_STATE_2;
  60. }
  61. else if (hallA == LOW && hallB == LOW && hallC == HIGH) {
  62. hallState = HALL_STATE_3;
  63. }
  64. else if (hallA == LOW && hallB == HIGH && hallC == HIGH) {
  65. hallState = HALL_STATE_4;
  66. }
  67. else if (hallA == LOW && hallB == HIGH && hallC == LOW) {
  68. hallState = HALL_STATE_5;
  69. }
  70. else if (hallA == HIGH && hallB == HIGH && hallC == LOW) {
  71. hallState = HALL_STATE_6;
  72. }
  73. return hallState;
  74. }

3、角度判定

目前为止,到扇区级,已经可以控制到60度范围内了。
一个扇区的60度之内如何确定精确角度?显然纯靠霍尔传感器已经没招了,这里采用一种叫插补的方法来估算角度,意思就是在一个扇区内,按照SVPWM的开关频率分成N份,每隔一个PWM周期,就认为走了一份角度。用专业的术语来表达,就是速度对时间积分。
电机有感控制-霍尔传感器 - 图6
描述:
S = V t
公式的意思:距离(0度到当前角度)= 速度(平均角速度)
t (时间)
用这么个办法一直计算下去,会有累积误差,为了降低累积误差的影响,所以每个扇区都重新校准一下,也就是用霍尔传感器的边沿(换扇区的时刻,这个是肯定准确的)对应的角度重新标定一下当前的角度。