找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6893|回复: 2
收起左侧

无刷电机霍尔匹配小工具制作(适用电机控制器霍尔120度)附单片机源码与电路

[复制链接]
ID:33998 发表于 2018-10-11 19:26 | 显示全部楼层 |阅读模式
玩过无刷电机的和电动车维修的人经常碰到电机霍尔和控制器不匹配的问题。主控是AT89c2051以前51单片机入门的时候买的扔了可惜所以拿来用了当然使用现在市面上的51单片机都可以 显示是12864液晶屏串行驱动,  按键就3个, 第一个是复位  第2个是匹配方式加  第3个是匹配方式减
总共6种接法。编程水平入门级 大神看了程序不要取笑。

废话少说直接上制作出来的实物图

1539256152280.jpg IMG_20181011_181232.jpg IMG_20181011_181237.jpg

Altium Designer画的原理图如下:(51hei附件中可下载工程文件)
0.png

单片机源程序如下:
  1. /* 液晶模块型号:JLX12864C-1
  2.    接口方式:串行
  3.    液晶模块驱动IC是:ST7920(或兼容的IC),
  4. */
  5. #include <reg51.h>
  6. sbit sid=P3^2;        //R/W
  7. sbit sclk=P3^3; //E

  8. sbit k1=P3^5;
  9. sbit k2=P3^4;

  10. sbit Q1=P3^7;
  11. #define  uchar unsigned char
  12. #define uint unsigned int

  13. uchar a=1;
  14. bit b=1;
  15. /*=============延时=====================*/
  16. void delay(int i)               
  17. {
  18. int j,k;
  19. for(j=0;j<i;j++)
  20. for(k=0;k<110;k++);
  21. }

  22. //=============transfer command to LCM===============
  23. void transfer_command(int data1)   //传输命令到LCM
  24. {
  25.         int i;

  26.         for(i=0;i<5;i++)
  27.         {
  28.                 sid=1;
  29.                 sclk=0;               
  30.                 sclk=1;               
  31.         }
  32.         sid=0;               
  33.         sclk=0;       
  34.         sclk=1;               
  35.         sid=0;       
  36.         sclk=0;       
  37.         sclk=1;               
  38.         sid=0;
  39.         sclk=0;               
  40.         sclk=1;               
  41.         for(i=0;i<4;i++)
  42.         {
  43.        
  44.                 if(data1&0x80) sid=1;
  45.                 else sid=0;
  46.                 sclk=0;       
  47.                 sclk=1;       
  48.                  data1=data1<<=1;
  49.          }
  50.          
  51.         for(i=0;i<4;i++)
  52.         {
  53.                 sid=0;
  54.                 sclk=0;               
  55.                 sclk=1;       
  56.         }       
  57.         for(i=0;i<4;i++)
  58.         {
  59.        
  60.                 if(data1&0x80) sid=1;
  61.                 else sid=0;
  62.                 sclk=0;               
  63.                 sclk=1;       
  64.                  data1=data1<<=1;
  65.          }
  66.          
  67.         for(i=0;i<4;i++)
  68.         {
  69.                 sid=0;
  70.                 sclk=0;               
  71.                 sclk=1;               
  72.         }       

  73. }

  74. //-----------transfer data to LCM---------------
  75. void transfer_data(int data1)//将数据传输到LCM
  76. {
  77.         int i;
  78.         for(i=0;i<5;i++)                        /*SID=1,5个脉冲,同步信号串*/
  79.         {
  80.                 sid=1;
  81.                 sclk=0;               
  82.                 sclk=1;
  83.         }
  84.         sid=0;                                                /*这一位为R/W设置,R/W=0表示写*/
  85.         sclk=0;
  86.         sclk=1;
  87.         sid=1;                                                /*这一位为RS设置,RS=1表示数据寄存器*/
  88.         sclk=0;
  89.         sclk=1;
  90.         sid=0;
  91.         sclk=0;
  92.         sclk=1;       
  93.         for(i=0;i<4;i++)                        /*传数据的高4位*/
  94.         {
  95.        
  96.                 if(data1&0x80) sid=1;
  97.                 else sid=0;
  98.                 sclk=0;
  99.                 sclk=1;
  100.                  data1=data1<<=1;
  101.          }
  102.          
  103.         for(i=0;i<4;i++)                        /*SID=0,过4个脉冲*/
  104.         {
  105.                 sid=0;
  106.                 sclk=0;
  107.                 sclk=1;
  108.         }       
  109.         for(i=0;i<4;i++)                        /*传数据的低4位*/
  110.         {
  111.        
  112.                 if(data1&0x80) sid=1;
  113.                 else sid=0;
  114.                 sclk=0;
  115.                 sclk=1;
  116.                  data1=data1<<=1;
  117.          }
  118.          
  119.         for(i=0;i<4;i++)                        /*SID=0,过4个脉冲*/
  120.         {
  121.                 sid=0;
  122.                 sclk=0;
  123.                 sclk=1;
  124.         }       
  125.                        
  126. }

  127. void clear_ddram()
  128. {
  129.         transfer_command(0x30);
  130.         transfer_command(0x01);
  131.         delay(5);
  132. }

  133. /*初始化*/
  134. void Initial_ic()
  135. {
  136.     delay(100);   
  137.         transfer_command(0x30);        /*选用基本指令集*/
  138.         delay(10);
  139.         transfer_command(0x01);     /*清屏*/
  140.         delay(10);
  141.         transfer_command(0x06);        //
  142.         delay(10);
  143. //        transfer_command(0x1c);        //光标右移
  144.         transfer_command(0x0c);/*开显示,关光标*/
  145.         delay(10);
  146. }

  147. /*调用中文字库里的汉字*/
  148. void display_char(int y,int x,int char_length,uchar *p)
  149. {
  150.         uchar i=0;
  151.         transfer_command(0x30);        /*选用基本指令集*/
  152.         delay(2);
  153.         //transfer_command(0x01);     /*清屏*/
  154.         delay(2);
  155.         if(y<3)
  156.         {
  157.                 transfer_command(0x80+(y-1)*(0x10)+(x-1));
  158.         }
  159.         else
  160.         {
  161.                 transfer_command(0x80+(y-3)*(0x10)+(x+7));
  162.         }
  163.         for(i=0;i<char_length;i++)
  164.         {
  165.                 transfer_data(*p);
  166.                 p++;
  167.                 transfer_data(*p);/*  以上两行数据合起来显示一个汉字*/
  168.                 p++;
  169.         }
  170. }

  171. //单行反显
  172. /*void OneLine_reverse(int y)
  173. {
  174.         if(y>0&&y<3)
  175.         {
  176.                 transfer_command(0x34);       
  177.                 delay(10);
  178.                 transfer_command(0x04+y-1);
  179.                 delay(10);
  180.         }

  181.         else
  182.         {
  183.                 y-=2;
  184.                 transfer_command(0x34);       
  185.                 delay(10);
  186.                 transfer_command(0x04+y-1);
  187.                 delay(10);
  188.         }       
  189. }*/





  190. /*主程序*/
  191. void main(void)
  192. {
  193.                  clear_ddram();
  194.                  Initial_ic();                                        /*初始化*/
  195.                          display_char(1,1,8,"无刷电机霍尔配对");  /*(在第1行,第1列,8个汉字)调用显示汉字子程序*/         
  196. //黄对黄  绿对绿 蓝对蓝        1
  197. //黄对黄  绿对蓝 蓝对绿 2
  198.          
  199. //黄对绿  绿对黄 蓝对蓝 3
  200. //黄对绿  绿对蓝 蓝对黄 4
  201.          
  202. //黄对蓝  绿对绿 蓝对黄 5
  203. //黄对蓝  绿对黄 蓝对绿 6

  204.         while(1)
  205.         {       
  206.         if(k1==0)
  207.                         delay(150);                 //消抖
  208. {
  209. if(k1==0)
  210. {
  211. while(!k1);
  212. a++;b=1;if(a>=6)a=6;
  213. }       
  214. }                       
  215.         if(k2==0)
  216.                        
  217. {
  218. if(k2==0)
  219. {
  220.         delay(150);                 //消抖
  221. while(!k2);
  222. a--;b=1;if(a<=1)a=1;       

  223. }
  224. }
  225. switch(a)
  226. {
  227.         case(1):if(b==1)
  228.         {P1=0XFC;
  229. //                         display_char(1,1,8,"无刷电机霍尔配对");  /*(在第1行,第1列,8个汉字)调用显示汉字子程序*/
  230.                          display_char(2,1,8,"黄对黄    绿对绿");  /*(在第2行,第1列,8个汉字)调用显示汉字子程序*/       
  231.                          display_char(3,1,8,"蓝对蓝          ");
  232.                          display_char(4,1,8,"匹配方式1       ");        b=0;       
  233.         }
  234.                 break;
  235.        
  236.         case(2):if(b==1)
  237.         {P1=0XE4;
  238.         //                 display_char(1,1,8,"无刷电机霍尔配对");  /*(在第1行,第1列,8个汉字)调用显示汉字子程序*/
  239.                          display_char(2,1,8,"黄对黄    绿对蓝");  /*(在第2行,第1列,8个汉字)调用显示汉字子程序*/       
  240.                          display_char(3,1,8,"蓝对绿          ");
  241.                          display_char(4,1,8,"匹配方式2       ");        b=0;       
  242.         }
  243.                 break;
  244.        
  245.         case(3):if(b==1)
  246.         {P1=0X9C;
  247.          //                display_char(1,1,8,"无刷电机霍尔配对");  /*(在第1行,第1列,8个汉字)调用显示汉字子程序*/
  248.                          display_char(2,1,8,"黄对绿    绿对黄");  /*(在第2行,第1列,8个汉字)调用显示汉字子程序*/       
  249.                          display_char(3,1,8,"蓝对蓝          ");
  250.                          display_char(4,1,8,"匹配方式3       ");        b=0;       
  251.         }
  252.                 break;
  253.        
  254.         case(4):if(b==1)
  255.         {P1=0XA8;
  256.         //                 display_char(1,1,8,"无刷电机霍尔配对");  /*(在第1行,第1列,8个汉字)调用显示汉字子程序*/
  257.                          display_char(2,1,8,"黄对绿    绿对蓝");  /*(在第2行,第1列,8个汉字)调用显示汉字子程序*/       
  258.                          display_char(3,1,8,"蓝对黄          ");
  259.                          display_char(4,1,8,"匹配方式4       ");        b=0;       
  260.         }
  261.                 break;
  262.        
  263.         case(5):if(b==1)
  264.         {P1=0X78;
  265.         //                 display_char(1,1,8,"无刷电机霍尔配对");  /*(在第1行,第1列,8个汉字)调用显示汉字子程序*/
  266.                          display_char(2,1,8,"黄对蓝    绿对绿");  /*(在第2行,第1列,8个汉字)调用显示汉字子程序*/       
  267.                          display_char(3,1,8,"蓝对黄          ");
  268.                          display_char(4,1,8,"匹配方式5       ");        b=0;       
  269.         }
  270.                 break;
  271.        
  272.         case(6):if(b==1)
  273.         {P1=0X54;
  274.         //                 display_char(1,1,8,"无刷电机霍尔配对");  /*(在第1行,第1列,8个汉字)调用显示汉字子程序*/
  275.                          display_char(2,1,8,"黄对蓝    绿对黄");  /*(在第2行,第1列,8个汉字)调用显示汉字子程序*/       
  276.                          display_char(3,1,8,"蓝对绿          ");
  277.                          display_char(4,1,8,"匹配方式6       ");        b=0;       
  278.         }
  279.                 break;
  280. }       

  281.         }
  282. }
复制代码

所有资料51hei提供下载:
AT89C2051-12864-霍尔匹配程序.rar (136.02 KB, 下载次数: 29)

评分

参与人数 1黑币 +90 收起 理由
admin + 90 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:258566 发表于 2018-10-11 22:56 | 显示全部楼层
只是提示.没测试功能.
回复

使用道具 举报

ID:408394 发表于 2018-10-12 08:47 | 显示全部楼层
拿来用了当然使用现在市面上的51单片机都可以 显示是12864液晶屏串行驱动,  按键就3个, 第一个是复位  第2个是匹配方式加  第3个是匹配方式减
总共6种接法。编程水平入门级 大神看了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表