5iMX宗旨:分享遥控模型兴趣爱好

5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)
12
返回列表 发新帖
楼主: mzral
打印 上一主题 下一主题

用单片机做了个脉冲输出的手柄。替代电脑控制

[复制链接]
21
发表于 2014-2-13 17:12 | 只看该作者
感谢

欢迎继续阅读楼主其他信息

22
发表于 2014-2-13 18:07 | 只看该作者
if else编写的代码可维护性差
用工用有限状态机的写法 用switch/case
23
发表于 2014-2-13 23:18 | 只看该作者
我去年底也做了一个,不过搞了一半就放下了,向你学习。争取今年搞完。
24
 楼主| 发表于 2014-2-13 23:50 | 只看该作者
/*********************************************************
*                                                        *
* 主函数                                                 *
*                                                        *
*********************************************************/
void main()
{
   uchar i;
   uchar j;
   delay(100);                 //上电,等待稳定
   lcd_init();                             //初始化LCD
   Timer_Init();                  //初始化定时器
   lcd_pos(1,0);
        while(DIS1[i] != '\0')
        {
                lcd_wdat(DIS1[i]);        //显示字符F:X10Y10Z10
                i++;
        }
   
   while(1)
   {
//=======================================================================
///////////////////////////////////////////////////////选择XYZ轴部分///11
   if(Kchice==0)
           {
                   delay(60);
                   if(Kchice==0)
                                           {
                                           i=0;
                                           j=j+1;
                                           if(j==1)
                                                   {
                                                           XLED=0;
                                                        YLED=1;
                                                        ZLED=1;
                                                   }
                                           if(j==2)
                                                   {
                                                           XLED=1;
                                                        YLED=0;
                                                        ZLED=1;
                                                   }
                                           if(j==3)
                                                   {
                                                           XLED=1;
                                                        YLED=1;
                                                        ZLED=0;
                                                   }
                                           if(j==4)
                                                   {
                                                           XLED=1;
                                                        YLED=1;
                                                        ZLED=1;
                                                        j=0;
                                                   }
                                           }
           }
///////////////////////////////////////////////////////选择XYZ轴部分///11
//=======================================================================
///////////////////////////////////////////////////////速度加快////////22
   if(Kfast==0)
           {
                   delay(60);
                   if(Kfast==0)
                                           {
                                                if(XLED==0)
                                                                {
                                                                Xrate=Xrate+1;
                                                                lcd_pos(1,4);
                                        lcd_wdat(num[Xrate/10]);
                                lcd_wdat(num[Xrate%10]);
                                                                if(Xrate==20)
                                                                                {
                                                                                  Xrate=19;       
                                                                                }                                          
                                                                }
                                                if(YLED==0)
                                                                {
                                                                Yrate=Yrate+1;   
                                                                lcd_pos(1,8);
                                        lcd_wdat(num[Yrate/10]);
                                lcd_wdat(num[Yrate%10]);
                                                                if(Yrate==20)
                                                                                {
                                                                                  Yrate=19;       
                                                                                }                                          
                                                                }
                                                if(ZLED==0)
                                                                {
                                                                Zrate=Zrate+1;
                                                                lcd_pos(1,12);
                                        lcd_wdat(num[Zrate/10]);
                                lcd_wdat(num[Zrate%10]);
                                                                if(Zrate==20)
                                                                                {
                                                                                  Zrate=19;       
                                                                                }                                          
                                                                }
                                           }
           }
///////////////////////////////////////////////////////速度加快////////22   
//=======================================================================
///////////////////////////////////////////////////////速度减慢////////33
   if(Kslow==0)
           {
                   delay(60);
                   if(Kslow==0)
                                           {
                                                if(XLED==0)
                                                                {
                                                                Xrate=Xrate-1;
                                                                lcd_pos(1,4);
                                        lcd_wdat(num[Xrate/10]);
                                        lcd_wdat(num[Xrate%10]);
                                                                if(Xrate==0)
                                                                                {
                                                                                  Xrate=1;       
                                                                                }       
                                                                }
                                                if(YLED==0)
                                                                {
                                                                Yrate=Yrate-1;
                                                                lcd_pos(1,8);
                                        lcd_wdat(num[Yrate/10]);
                                        lcd_wdat(num[Yrate%10]);
                                                                if(Yrate==0)
                                                                                {
                                                                                  Yrate=1;       
                                                                                }       
                                                                }
                                                if(ZLED==0)
                                                                {
                                                                Zrate=Zrate-1;
                                                                lcd_pos(1,12);
                                        lcd_wdat(num[Zrate/10]);
                                        lcd_wdat(num[Zrate%10]);
                                                                if(Zrate==0)
                                                                                {
                                                                                  Zrate=1;       
                                                                                }       
                                                                }
                                                }
                        }
///////////////////////////////////////////////////////速度减慢////////33
//=======================================================================
///////////////////////////////////////////////////////X轴加///////////44
if(KXA==0)
           {
           flagKXA=0;
           flagKXB=1;
           Xfanzheng=0;                                  
           }
if(KXA==1)
           {
           flagKXA=1;
           if(KXB==1)
                           {
                                   Xzhishi=1;
                           }                                          
           }
///////////////////////////////////////////////////////X轴加///////////44
///////////////////////////////////////////////////////X轴减///////////55
if(KXB==0)
                {
                flagKXA=1;
                flagKXB=0;
                Xfanzheng=1;
                }
if(KXB==1)
                {
                flagKXB=1;
            if(KXA==1)
                           {
                                   Xzhishi=1;
                           }                                          
                }
///////////////////////////////////////////////////////X轴减///////////55
//=======================================================================
///////////////////////////////////////////////////////Y轴加///////////66
if(KYA==0)
           {
           flagKYA=0;
           flagKYB=1;
           Yfanzheng=0;                                  
           }
if(KYA==1)
           {
           flagKYA=1;
           if(KYB==1)
                           {
                                   Yzhishi=1;
                           }                                          
           }
///////////////////////////////////////////////////////Y轴加///////////66
///////////////////////////////////////////////////////Y轴减///////////77
if(KYB==0)
                {
                flagKYA=1;
                flagKYB=0;
                Yfanzheng=1;
                }
if(KYB==1)
                {
                flagKYB=1;
            if(KYA==1)
                           {
                                   Yzhishi=1;
                           }                                          
                }
///////////////////////////////////////////////////////Y轴减///////////77
//=======================================================================
///////////////////////////////////////////////////////Z轴加///////////88
if(KZA==0)
           {
                Zdelay(20-Zrate);
                z=z+1;
                if(z>100)
                                {
                                Zzhishi=~Zzhishi;       
                                }
                Zmaichong=~Zmaichong;       
                Zfanzheng=0;                  
           }
if(KZA==1)
           {
                       if(KZB==1)
                           {
                                   Zzhishi=1;
                           }                                          
           }
///////////////////////////////////////////////////////Z轴加///////////88
//=======================================================================
///////////////////////////////////////////////////////Z轴减///////////99
if(KZB==0)
                {
                Zdelay(20-Zrate);
                z=z+1;
                if(z>150)
                                {
                                Zzhishi=~Zzhishi;
                                z=0;       
                                }
                Zmaichong=~Zmaichong;
                Zfanzheng=1;                  
                }
if(KZB==1)
                {
            if(KZA==1)
                           {
                                   Zzhishi=1;
                                z=0;
                           }                          
                }
///////////////////////////////////////////////////////Z轴减///////////99
//=======================================================================
    }
}
/*****************************程序模拟完成,xyz默认速度调节可用,等待上机调试步进速度****************************/
25
 楼主| 发表于 2014-2-13 23:58 | 只看该作者
rick_hou 发表于 2014-2-13 23:18
我去年底也做了一个,不过搞了一半就放下了,向你学习。争取今年搞完。

坚持就是胜利,预祝你的也早点完工,,,我这个代码因为xy轴常用,考虑到xy轴时间信号的精准度,所以用的单片机系统里面的中断功能,所以代码多了点,如果用delay()延时,代码量可减少很多。。

26
 楼主| 发表于 2014-2-14 00:09 | 只看该作者

代码还没完工,上机还没测试。。不敢称强人,只是个爱好者,等完全调试好了,再上传程序的附件,机械方面还要多多跟坛友请教,不知不觉过凌晨了。睡觉白白。
27
发表于 2014-2-14 00:17 | 只看该作者
挺好的学习帖子,楼主的精神也很可贵

28
发表于 2014-2-14 02:14 | 只看该作者
mzral 发表于 2014-2-13 23:58
坚持就是胜利,预祝你的也早点完工,,,我这个代码因为xy轴常用,考虑到xy轴时间信号的精准度,所以用的 ...

呵呵,我当时是用arduino的定时中断产生脉冲的,程序写的有点乱,现在已经都看不明白了。电子手轮是100脉冲的,还用了摇杆,可以切换,还有自动走刀的功能。
29
 楼主| 发表于 2014-2-14 08:28 | 只看该作者
rick_hou 发表于 2014-2-14 02:14
呵呵,我当时是用arduino的定时中断产生脉冲的,程序写的有点乱,现在已经都看不明白了。电子手轮是100脉 ...

你说的倒是提醒我了...可以整个上下左右的那种摇杆.比按钮好多了..然后再加个小键盘,再整个usb转串口通讯,,功能就全了...


30
发表于 2014-2-14 12:11 | 只看该作者
用雕刻机刻板不更快?
31
发表于 2014-2-14 18:48 | 只看该作者
mzral实名认证
32
 楼主| 发表于 2014-2-14 19:17 | 只看该作者
78683612 发表于 2014-2-14 12:11
用雕刻机刻板不更快?

米有雕刻机、、、只有20W黄花电烙铁 和 焊锡。。
33
发表于 2014-2-14 20:22 | 只看该作者
mzral 发表于 2014-2-14 00:09
代码还没完工,上机还没测试。。不敢称强人,只是个爱好者,等完全调试好了,再上传程序的附件, ...

互相指教
34
发表于 2014-2-15 10:54 | 只看该作者
我也用89S52单片机做了个功能差不多,只是我不会单片机语言。用的是梯形图转Pwm再转HEX.只是梯形图用的定时器太大了。步进电机转的太慢。换24M晶振还是慢。你的不错啊功能多。哈哈做好了我仿造个啊。

35
发表于 2014-2-15 16:07 | 只看该作者
这样搭桥看的头大,画个电路图,雕刻机上雕个电路板美观又稳定,我就雕了块音调板,音质相当好。
36
 楼主| 发表于 2014-2-15 18:46 | 只看该作者
本帖最后由 mzral 于 2014-2-15 18:53 编辑
xxdz12345 发表于 2014-2-15 10:54
我也用89S52单片机做了个功能差不多,只是我不会单片机语言。用的是梯形图转Pwm再转HEX.只是梯形图用的定时 ...


11.0592M感觉应该够用,调到脉冲最快的时候 驱动器用16细分以下,电机直接启动不起来,如果细分再增加可以直接启动,但怕速度慢。只能等同步轮 和钻铣床到了再研究这些了,如果速度不够晶振再换个高频率的,如果用汇编编写速度还能更快,只可惜汇编没学好。只能用C了,浪费了很多硬件的周期


37
 楼主| 发表于 2014-2-15 18:48 | 只看该作者
lisui 发表于 2014-2-15 16:07
这样搭桥看的头大,画个电路图,雕刻机上雕个电路板美观又稳定,我就雕了块音调板,音质相当好。

没雕刻机,,在想如果钻铣床精度调高了,连上电脑,看看能不能雕刻个板。。

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

【站内推荐】上一条 /2 下一条

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