找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2476|回复: 7
打印 上一主题 下一主题
收起左侧

求助用单片机+编码器控制步进电机停止

[复制链接]
跳转到指定楼层
楼主
ID:710256 发表于 2020-4-18 20:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我是想通过计算出来的太阳角度控制步进电机旋转同样的角度,一旦两者度数相差2度以上,步进电机就旋转相差的度数然后停止,步进电机旋转的角度通过增量式编码器来计算,编码器暂时用按键代替,步进电机停止后把编码器的脉冲数停止。现在的问题是仿真时电机会启动但是停不下来,有大佬可以指教一下错在哪里吗

单片机源程序如下:
  1. #include <REG52.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. sbit B0 = P3^2;
  5. sbit B1 = P3^3;
  6. //编码器
  7. uchar   angle[3];          //储存角度
  8. uchar   c = 10;            //方位电机旋转的角度
  9. uchar   d;                 //高度电机的角度
  10. uint    b,b1;               //编码器脉冲数
  11. void Out_Init(void)//外部中断初始化
  12. {
  13. EX0 = 1;  //开外部中断0
  14.     EX1 = 1;  //开外部中断1
  15.         IT0 = 1;  //负边沿触发
  16.     IT1 = 1;//负边沿触发
  17.         EA = 1;          //开总中断
  18. }
  19. /*外部中断0,方位编码器脉冲加1*/
  20. void Out_Int0(void) interrupt 0        
  21. {
  22.    if(B0 == 1)
  23.     b++;
  24. }
  25. /*外部中断1,高度编码器脉冲加1*/
  26. void Out_Int1(void) interrupt 2
  27. {
  28.   if(B1 == 1)
  29.   b1++;
  30. }
  31. /*视日轨迹追踪*/
  32. void trackgo()
  33. {
  34.     uchar h,f;
  35.     uchar w,z;
  36.     anglecalculate(); //计算太阳角度
  37.     f=angle[1];//得到方位角
  38.     w=f-c;//将方位角与电机旋转角度对比
  39.     c = c+b*0.3;//方位电机旋转的角度
  40.     if(w>2)
  41.      {  
  42.   fw = 1;// 方位电机启动
  43.   zeng = 1; //方位电机正转
  44.      }
  45.     else
  46.      {
  47.    b = 0;//脉冲数清零
  48.    fw = 0;//方位电机停止
  49.    zeng = 0;//正转标志清零
  50.    h = angle[0];//获得高度角
  51.    z = h-d;差值计算
  52.    d = d+b1*0.3;//高度电机旋转的角度
  53.     if(z>2)
  54.     {
  55.       gd = 1;//高度电机启动
  56.       zeng = 1;//高度电机正转
  57.      }
  58.    else
  59.    {
  60.      b1 = 0;//高度编码器脉冲数清零
  61.      gd = 0;//高度电机停止
  62.      zeng = 0;//正转标志清零
  63. }
  64.       }
  65. }
  66. //*****************************************************
  67. //函数:void main()
  68. //功能:主函数,初始化
  69. //*****************************************************
  70. void main()
  71. {
  72.     uchar time_30s=0;
  73.     uint getdata;
  74.     float temp;
  75.         uint temp1;
  76.         time_500ms = 0;
  77.         flag_js = 0;
  78.     timer_init();
  79.     Out_Init();
  80.     delay_ms(50);
  81.     LIGHT_DETECTION=read2543(0x20);
  82.         while(1)
  83.         {
  84.     if(time_500ms == 50)
  85.      {
  86.         time_30s++;
  87.         
  88.        if(time_30s==6)//3s判定一次方位
  89.         {
  90.           time_30s=0;
  91.           getdata=read2543(0x20);
  92.           getdata=read2543(0x20);
  93.           getdata=read2543(0x20);
  94.           temp=(float)getdata/4095;//通过tlc5243进行AD转换
  95.           temp1 = temp*500;//保留两位小数
  96.         LIGHT_DETECTION=temp1;//光照强度
  97.         if(LIGHT_DETECTION<300&&LIGHT_DETECTION>100)
  98.          {
  99.           trackgo();           
  100.           }
  101.        }
  102.    }
  103. }
  104. }  
复制代码



sun.zip

163.96 KB, 下载次数: 15

程序加仿真图

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:94031 发表于 2020-4-18 20:51 | 只看该作者
你的U18控制的步进电机是由U2-INPUT输入的数据控制,只要你INPUT不输入,U18控制的步进电机就不会转。
回复

使用道具 举报

板凳
ID:710256 发表于 2020-4-19 09:20 | 只看该作者
xuyaqi 发表于 2020-4-18 20:51
你的U18控制的步进电机是由U2-INPUT输入的数据控制,只要你INPUT不输入,U18控制的步进电机就不会转。

谢谢你的回复,只是我现在的问题时电机启动后不会停止,我是通过编码器记录电机旋转的角度然后控制电机停止,但现在电机却停不下来,不清楚问题究竟在哪
回复

使用道具 举报

地板
ID:628175 发表于 2020-4-24 11:50 来自手机 | 只看该作者
哇。兄弟你该好了嘛。我想学习一下
回复

使用道具 举报

5#
ID:628175 发表于 2020-4-24 12:12 来自手机 | 只看该作者
朋友有仿真嘛
回复

使用道具 举报

6#
ID:628175 发表于 2020-5-5 13:30 来自手机 | 只看该作者
朋友你修改好了嘛。能发送给我看下嘛。麻烦了。有偿也行。谢谢
回复

使用道具 举报

7#
ID:649098 发表于 2020-12-15 21:51 | 只看该作者
把两个外部中断里的if判断语句删去即可实现
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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