本帖最后由 十六十琉 于 2022-3-29 23:18 编辑

基于给出的工程模板,做无刷直流电机的模拟调试。
1、调试开始前,测量电机参数:
1.png
①用万用表两两测出线电阻分别为:1.4/1.5/1.6,取平均电阻1.5Ω,相电阻为0.75Ω;
②用数字电桥在1KHz下两两测出线电感为4.45/4.34/4.1mH,取平均电感4.297mH;相电感为2.15mH;
③用示波器测出两相间反电动势峰峰值为67.6V,周期约150ms--即频率6.67Hz,极对数为2,求得反电动势常数97.09;
2.png
④基于电机参数,设置额定转速为3000,速度基准取两倍即6000;
2、选择模拟调速模式:
3.png

转动旋钮,经过AD转换,可发现电机转速随VR1的模拟值大小发生变化,在keil51调试模式下,可读取ADCSpeed值变化区间:0x0018-0x7FF7,即00024-32758;
4.png
下限:
5.png
上限:
6.png

速度实际值ActualValue变化区间:0x000-0x3FFF;
下限:
7.png
上限:
8.png
转动VR1即可调速,此处便不展示了;
  1. void main(void)
  2. {
  3.     uint16 PowerUpCnt = 0;
  4.    
  5.     /*********上电等待*********/
  6.     for (PowerUpCnt = 0; PowerUpCnt < SystemPowerUpTime; PowerUpCnt++);
  7.    
  8.      /* ADC参考电压电压配置 */
  9.     VREFConfigInit();
  10.     /* Hardware & Software I0nitial */
  11.     HardwareInit();
  12.     SoftwareInit();   
  13.     DebugSet();
  14.     /* 总中断使能 */
  15.     EA = 1;  
  16.    
  17.     while (1)
  18.     {
  19.         if(GP13==0){while(1){VSP=0x7FF6;if(GP42==0)break;}}
  20.         if(GP42==0){while(1){VSP=0x1111;if(GP13==0)break;}}
  21.                        
  22. //        VSP:0x17-0x7FF6;
  23.         /* -----Current calibration----- */
  24.         GetCurrentOffset();
  25.         /* -----Motor Control State----- */
  26.         MC_Control();
  27.         _nop_();
  28.     }
  29. }
2.gif 1.gif

3、本来想做FU6832L板与外部单片机的UART通信,实现由51单片机温度传感器通过串口改变VSP值,从而实现电机转速随温度变化,但手边的51单片机只有USB转TTL的模块芯片,干不了;想做模拟风扇多模式多档位调节,但是Speed_Mode不允许切换状态,定速模式也不允许更改数值,最后把VR1旋钮和滤波禁掉,采用赋值的方式进行按键切换,并加入中断模拟定时关闭(或降速)功能。
but,遇见了一个问题,所以还没实现中断功能,找不到教程如何将P1_IE寄存器只配置为P1.3口的控制状态,函数如下:
  1. #include <MyProject.h>
  2. #include "Delay.h"

  3. void Int0init()
  4. {
  5. EX1=0;//中断2使能位
  6. P1_IE=1;//使能
  7. P1_IF=0;//标志位

  8. ClrBit(P1_OE, P13);//配置P0.0等为可使用状态
  9. //SetBit(P1_PU, P13);//输入使能,上拉
  10. //
  11. //        如何让P1.3开关控制P1_IF是目前没能解决的问题
  12. //       
  13. ClrBit(TCON,IT11);//下拉触发中断
  14. SetBit(TCON,IT10);

  15. }

  16. void main()
  17. {

  18. uint16 PowerUpCnt = 0;
  19.        
  20.           SetBit(P4_OE, P44);//配置LED等为可使用状态
  21.     SetBit(P4_PU, P44);

  22.        
  23.     Int0init();
  24.     EX1=1;
  25.     EA=1;
  26.     for (PowerUpCnt = 0; PowerUpCnt < SystemPowerUpTime; PowerUpCnt++);
  27.           
  28.   while(1)
  29. {
  30.           switch(mode)
  31.                         {
  32.                         case(1):if(mode==1){VSP=0x7ff0;GP44=0;}break;
  33.                         case(2):if(mode==2){VSP=0x2ff0;GP44=1;}break;
  34.                         case(3):if(mode==3){VSP=0x0017;GP44=!GP44;Delay(2000);}break;
  35.                         }
  36. }
  37. }

  38. void INT1 interrupt 1
  39.         {
  40.         if(GP13==0)
  41.         {
  42.                 GP13=1;
  43.           Delay(1000);
  44.                 if(GP13==0)
  45.                 {GP13=1;
  46.                         mode++;
  47.                         if(mode>=4)
  48.                         {
  49.                                 mode=1;
  50.                         }
  51.                         while(!GP13);
  52.                 }
  53.         }
  54. }

后边是发现一个问题不知道该如何解决,在keil调试模式下,点击运行即电机按照期望速度旋转,但点击红叉停止时,有概率出现飚速现象,即转速增高并稳定,且不受终止、退出调试等影响,只能断电。
1477025200ba85595022d2d11297f607.gif
最后,永磁同步电机卡路上了(青岛封校小20天了),一些功能也因为缺少器件做不出来,更主要的问题是,自己还有很多的东西要学,感觉还没摸索到这块板子的百分之一,继续干吧。