B站相关视频
控制器MEGA程序: D:\zhuoqing\window\Atmel\tools\TransferCntM8
AD\Tools\TransferCntM8\TransferCntM8.SchDoc
01 旋转平台
一、前言
这是一个旋转平台, 可以承载较大的物体旋转。 之前基于这个平台拍摄了一些物体的旋转投射图片, 用于X射线物体识别。 下面计划重新使用这个平台进行实验。
二、硬件设计
这个旋转平台控制电路板在2019年制作, 为了应用, 今天找到对应的设计原理图。 控制器基于MEGA8设计。
▲ 图1.2.1 控制原理图
AD\Tools\TransferCntM8\TransferCntM8.SchDoc
使用单面制版, 制作了控制器实际电路板。 控制器可以通过手控, 或者串口控制转台的旋转。 转台旋转一周大约需要 150000步。 时间 30秒。
-
旋转参数:
-
步数
:0x25100(151808)
时间
:30秒
测试一下转台具体运转的情况。 这个转台运转非常平稳。
三、控制协议
根据MEGA8程序, 可以知道控制通讯协议。 通过UART 连接控制器, 波特率为 115200。 发送 字节 0, 旋转平台归零。 下面四个命令, 控制转台旋转。 前面两个是带有两个字节参数表示旋转步数, 后面两个带有 三个字节参数。 旋转包括有顺时针旋转, 以及逆时针旋转。 顺时针旋转不受 0 点位置传感器的影响。 逆时针旋转则会在 0 点位置停留。 后面两个命令是读取当前绝对位置。 命令6在返回位置的同时, 平台停止运行。
命令编码 | 参数 | 功能 | 备注 |
---|---|---|---|
00 | NULL | 回归到 0 点位置 | 无返回 |
01 | n1 n2 | 顺时针旋转 n1*256+n2 步 | 可以过0点位置 |
02 | n1 n2 | 逆时针旋转 n1*256 + n2 步 | 在0点位置停止 |
03 | n1 n2 n3 | 顺时针旋转 n165536+n2256+n3 | 可以过0点位置 |
04 | n1 n2 n3 | 顺时针旋转 n165536+n2256+n3 | 在0点位置停止 |
05 | NULL | 返回当前位置 | 四个字节 |
06 | NULL | 返回当前位置, 停止运行 | 四个字节 |
/*
**==============================================================================
** 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
※ 总 结 ※
本文针对之前的一台旧辅助设备进行了测试。 找到了它对应的硬件设计和软件设计文档, 获得了对应的控制命令协议。 这为后面基于该平台的实验打下了基础。
● 相关图表链接: