旋转平台控制器

B站相关视频

控制器MEGA程序: D:\zhuoqing\window\Atmel\tools\TransferCntM8

AD\Tools\TransferCntM8\TransferCntM8.SchDoc

 

01 转平台


一、前言

  这是一个旋转平台,  可以承载较大的物体旋转。  之前基于这个平台拍摄了一些物体的旋转投射图片, 用于X射线物体识别。  下面计划重新使用这个平台进行实验。

GM1699166462_1280_720.MPG|_-5

二、硬件设计

  这个旋转平台控制电路板在2019年制作,  为了应用, 今天找到对应的设计原理图。 控制器基于MEGA8设计。

GM1699167096_1280_720.MPG|_-3

▲ 图1.2.1 控制原理图

▲ 图1.2.1 控制原理图

AD\Tools\TransferCntM8\TransferCntM8.SchDoc

  使用单面制版, 制作了控制器实际电路板。 控制器可以通过手控, 或者串口控制转台的旋转。  转台旋转一周大约需要 150000步。 时间 30秒。

GM1699168267_1280_720.MPG|_-3

旋转参数:
步数:0x25100(151808)
时间:30秒

  测试一下转台具体运转的情况。 这个转台运转非常平稳。
GM1699169033_1280_720.MPG|_-2

三、控制协议

  根据MEGA8程序, 可以知道控制通讯协议。 通过UART 连接控制器, 波特率为 115200。  发送 字节 0, 旋转平台归零。  下面四个命令, 控制转台旋转。  前面两个是带有两个字节参数表示旋转步数, 后面两个带有 三个字节参数。 旋转包括有顺时针旋转,  以及逆时针旋转。  顺时针旋转不受 0 点位置传感器的影响。 逆时针旋转则会在 0 点位置停留。  后面两个命令是读取当前绝对位置。  命令6在返回位置的同时, 平台停止运行。
GM1699170557_1280_720.MPG|_-10

命令编码参数功能备注
00NULL回归到 0 点位置无返回
01n1 n2顺时针旋转 n1*256+n2 步可以过0点位置
02n1 n2逆时针旋转 n1*256 + n2 步在0点位置停止
03n1 n2 n3顺时针旋转 n165536+n2256+n3可以过0点位置
04n1 n2 n3顺时针旋转 n165536+n2256+n3在0点位置停止
05NULL返回当前位置四个字节
06NULL返回当前位置, 停止运行四个字节
/*
**==============================================================================
** main.c :             -- by Dr. ZhuoQing, 2007-3-31
**
**   This project is designed for the PumpCnt
**
**==============================================================================
*/

//------------------------------------------------------------------------------
LED_ON        = OFF(LED)
LED_OFF        = ON(LED)
//------------------------------------------------------------------------------
void C_task main(void) {
    unsigned long lnCount;
    unsigned char ucChar;        
    unsigned int nADC;
    unsigned int nPulseCount;
    unsigned int nReceNumber;
    unsigned long lnNumber;
    
    //--------------------------------------------------------------------------
    Mega8Init();
    ControlInit();    
    
    //--------------------------------------------------------------------------

    //--------------------------------------------------------------------------
    lnCount = 0;
    nPulseCount = 0;
    
    //--------------------------------------------------------------------------
    for(;;) {
        //----------------------------------------------------------------------
        WaitTime(1);
        lnCount ++;
        if(lnCount & 0x200) LED_ON;
        else LED_OFF;
            
        //----------------------------------------------------------------------
        if(g_lnPulseCount != 0) {
            if(lnCount & 0x300) ON(BEEP);
            else OFF(BEEP);
        } else ON(BEEP);
            
        //----------------------------------------------------------------------
        if(VAL(POS)== 0) {
            OFF(BEEP);
            WaitTime(100);
            if(VAL(POS) == 0) {
                g_lnPulseCount -= 2140;
            }
            
            for(;;) {
                if(VAL(POS)) break;
            }
        
            WaitTime(1000);
            ON(BEEP);
        }
        
        //----------------------------------------------------------------------
        if(CAN_RECE) {
            ReceChar(&ucChar);
            switch(ucChar) {
                case 0x0:
                    g_lnPulseCount = 0x1000000;
                    g_ucComputerFlag = 2;
                    g_nInt1Cnt = 0;
                    SendInt32BIN(g_lnPositionCount);
                    break;
                case 0x1:
                    if(ReceChar(&ucChar) == 0) {
                        nReceNumber = ucChar;
                        if(ReceChar(&ucChar) == 0) {
                            nReceNumber = (nReceNumber << 8) + ucChar;
                            if(g_ucComputerFlag == 2) g_lnPulseCount = 0;
                            g_lnPulseCount -= nReceNumber;
                            g_ucComputerFlag = 1;
                            g_nInt1Cnt = 0;
                            SendInt32BIN(g_lnPositionCount);
                        }
                    }
                    break;
                case 0x2:
                    if(ReceChar(&ucChar) == 0) {
                        nReceNumber = ucChar;
                        if(ReceChar(&ucChar) == 0) {
                            nReceNumber = (nReceNumber << 8) + ucChar;
                            g_lnPulseCount += nReceNumber;
                            g_ucComputerFlag = 1;
                            g_nInt1Cnt = 0;
                            SendInt32BIN(g_lnPositionCount);
                        }
                    }
                    break;
                case 0x3:
                    if(ReceChar(&ucChar) == 0) {
                        lnNumber = ucChar;
                        if(ReceChar(&ucChar) == 0) {
                            lnNumber = (lnNumber << 8) + ucChar;
                            if(ReceChar(&ucChar) == 0) {
                                lnNumber = (lnNumber << 8) + ucChar;
                                g_lnPulseCount -= lnNumber;
                                g_ucComputerFlag = 1;
                                g_nInt1Cnt = 0;
                                SendInt32BIN(g_lnPositionCount);
                            }
                        }
                    }
                    break;
                case 0x4:
                    if(ReceChar(&ucChar) == 0) {
                        lnNumber = ucChar;
                        if(ReceChar(&ucChar) == 0) {
                            lnNumber = (lnNumber << 8) + ucChar;
                            if(ReceChar(&ucChar) == 0) {
                                lnNumber = (lnNumber << 8) + ucChar;
                                g_lnPulseCount += lnNumber;
                                g_ucComputerFlag = 1;
                                g_nInt1Cnt = 0;
                                SendInt32BIN(g_lnPositionCount);
                            }
                        }
                    }
                    break;
    
                case 0x5:
                    SendInt32BIN(g_lnPositionCount);
                    break;        
                    
                case 0x6:
                    g_lnPulseCount = 0;
                    SendInt32BIN(g_lnPositionCount);
                    break;        
                default:
                    break;
            }
        }
            
        //----------------------------------------------------------------------
        if((++ nPulseCount) >= 10) {
            nPulseCount = 0;
            if(g_nInt1Cnt >= 400 || g_nInt1Cnt < -400) {
                CLI();
                if(g_ucComputerFlag) {                    
                    if(g_nInt1Cnt > 0 && g_lnPulseCount < 0 ||
                        g_nInt1Cnt < 0 && g_lnPulseCount > 0) {
                        g_lnPulseCount = 0;
                        g_ucComputerFlag = 0;
                    } else {
                        g_lnPulseCount += g_nInt1Cnt;
                    }
                } else {
                    if(g_nInt1Cnt > 800) {
                        g_lnPulseCount += g_nInt1Cnt;
                        g_nInt1Cnt = 0;
                    } else if(g_nInt1Cnt < -100) {
                        if(g_lnPulseCount == 0)
                            g_lnPulseCount-= 4280;
                        g_nInt1Cnt = 0;
                    }
                    
                    if(g_lnPulseCount >= 1000) {
                        g_lnPulseCount = 0x1000000;
                        g_ucComputerFlag = 2;
                    }
                }

                SEI();
                
                g_nInt1Cnt = 0;
            }
        }
        //----------------------------------------------------------------------
    }
}

//==============================================================================
//             END OF THE FILE : main.c
//------------------------------------------------------------------------------
/*
**==============================================================================
** CONTROL.C:             -- by Dr. ZhuoQing, 2013-2-13
**
**==============================================================================
*/

//==============================================================================
//                    INTERFACE FUNCTIONS
//------------------------------------------------------------------------------
void ControlInit(void) {
    OUT(LED);
    ON(LED);
    
    //--------------------------------------------------------------------------
    IN(CNT_PIN);
    ON(CNT_PIN);
    
    ON(SM_DIR);
    ON(SM_CLK);
    ON(SM_ENA);
    OUT(SM_DIR);
    OUT(SM_CLK);
    OUT(SM_ENA);
    
    ON(POS);
    IN(POS);
    
    ON(BEEP);
    OUT(BEEP);
    //--------------------------------------------------------------------------
    
    g_lnPulseCount = 0;
    g_ucComputerFlag = 0;
    g_lnPositionCount = 0;
}

//------------------------------------------------------------------------------
void PulseProc(void) {
    if(g_lnPulseCount == 0) {
        OFF(SM_ENA);
        return;
    }
    
    ON(SM_ENA);
        
    if(g_lnPulseCount > 0) {
        ON(SM_DIR);
        
        if(VAL(POS) == 0) {
            g_lnPulseCount = 0;
            g_lnPositionCount = 0;
            OFF(SM_ENA);
            return;
        }
        
        g_lnPulseCount --;
        
        if(g_lnPositionCount > 0) g_lnPositionCount --;
            
        ON(SM_CLK);
        Delay(1);
        OFF(SM_CLK);
    } else if(g_lnPulseCount < 0) {
        OFF(SM_DIR);
        
        g_lnPulseCount ++;
        g_lnPositionCount ++;
        
        ON(SM_CLK);
        Delay(1);
        OFF(SM_CLK);

    }
}

//------------------------------------------------------------------------------            

//------------------------------------------------------------------------------
//             THE OF THE FILE : CONTROL.C

 

  结 ※


  文针对之前的一台旧辅助设备进行了测试。 找到了它对应的硬件设计和软件设计文档,  获得了对应的控制命令协议。  这为后面基于该平台的实验打下了基础。

GM1699171088_1280_720.MPG|_-4


● 相关图表链接:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卓晴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值