本帖最后由 tianyuan08 于 2020-3-16 23:36 编辑
天文爱好初学者一枚,有一个晶华的JE100A赤道仪,102普消,某夜观测猎户座星云用相机曝光2秒排到了M42,无奈没有电跟系统,无法长时曝光,某宝看了看一个JE100A电跟竟然要680,性价比极低,于是萌生了自制电跟的想法。看了好多帖子关于如何制作电跟,但是细节比较少,打算把制作电跟的基础讲一下,大神轻拍!
1. 器材
从某宝购置4件:(1)42步进电机,扭矩0.25NM,电流1A,步距角1.8度;(2)Arduino开发板,国产的UNO R3;(3)TB6600升级版步进电机驱动器;(4)12V锂电池,18650电芯,公母双出D头;(5)0.5模45不锈钢20齿,0.5模铝合金80齿,齿比1:4;
2. 计算
(1)力矩问题,电机扭矩最大0.28NM,0.5模20齿的齿轮半径大约0.005m,则在齿轮圆周上的最大受力为0.28/0.005=56N,电机齿轮与赤经蜗杆上装的齿轮齿比是1比4,赤经蜗杆齿轮半径大约0.02m,也就是说赤经蜗杆扭矩1.12NM以下,电机还能转得动。现在需要算一下,装上主镜后,转动赤经时赤经蜗杆扭矩是多少,例如我的主镜为3kg,重力是30N,主镜的重心到与赤经蜗杆连接的极轴齿轮距离假设0.3m,那么转动主镜所需扭矩就是9NM。赤经蜗杆的传动比是多少我不清楚,猜测难道是1比144?因为蜗杆转144圈,赤经才能转1圈,如果是1比144,那赤经蜗杆所需扭矩就小的不能再小了,才0.0625NM,再通过赤经蜗杆齿轮传递到电机,电机轴扭矩只要达到0.016NM,就转起来了,哪怕考虑到各种连接的传动效率,实际电机所需输出扭矩也远小于0.28NM,所以42步进电机的力量绝对够用。
(2)电机脉冲数,JE100A的赤经齿数为144,赤经刻度盘刻度数为24*6=144个刻度,简单的测试了一下,当我转动赤经微调一周时,刻度盘上刚好转过一个刻度,也就是说144齿无误。地球一天24小时,1440分钟,分解到刻度盘上,就是10分钟一个刻度,地球每小时15度,则每个刻度是2.5度,也就是说赤经轴转360度,刚好能抵消地球自转10分钟。现在就知道了,我们需要让赤经轴以每10分钟转360度运行。在齿比是1:4的情况下,赤经轴转1周,电机上的齿轮需要转4周,也就是说每10分钟电机转4周即可。步距角1.8度情况下,42步进电机需要200步转360度,600秒(10分钟)转4周需要800步,则每秒1.33333333步,也就是频率为1.333333HZ,周期为0.75s。这种转法行不行?行,问题就是震动有点点大,如果要减小电机的震动,则必须细分。我目前选择的是8倍细分,也就是步进电机1600步才能转一周,此时600秒走过6400步,频率为10.666666666HZ,周期为0.09375s,这时候步进电机的转动会平稳很多,没有突突突的感觉了!
3. 调试
(1)接线,将步进电机的A+ A- B+ B-四根线接入TB6600(TB6600上有标注),此时电机的控制将由驱动器完成,我们不需要写程序分别控制电流输出到电机,所以只需要负责脉冲信号即可。在Arduino开发板上,选择可输出脉冲信号的口,比如我的UNO R3上3、5、6、9、10、11是可以输出脉冲信号的端口(开发板上可以看出来,端口号旁边有个~符号),随便选一个端口,将线接入TB6600驱动器的PUL+,再将TB6600驱动器上的PUL-接入Arduino板上的GND。TB6600的细分在外壳上也有说明,根据说明将上面的开关调整合适即可!另外注意电流的设置!
(2)程序控制
Arduino开发板的开发非常简单,步进电机的控制程序用几行代码也就搞出来了,Arduino怎么配置我就不多说了,网上资料很多,无非就是先装个CH340 USB转串口驱动,再把开发板连到电脑上,下载一个Arduino的IDE(集成开发环境),就能用了!Arduino的IDE进去以后,大家会看到两个函数:setup和loop。setup是开发板通电后,只会运行一次,一般用来设置一些环境和变量,而loop其实就是程序的一个死循环,我们需要在setup里设置端口输入输出,在loop里写脉冲发送,一个简单的程序如下:
//在setup里设置脉冲输出为开发板的D9
void setup() {
// put your setup code here, to run once:
pinMode(9, OUTPUT); //在这里指定开发板上的D9为输出信号端口
}
//将电机控制写loop函数里,loop函数里的内容会一直执行下去
void loop() {
// put your main code here, to run repeatedly:
for(int i=0; i<6400; i++)
{
digitalWrite(9, HIGH); //给D9一个高电平
delay(46); //延迟46ms
delayMicroseconds(875); //延迟0.875ms,delayMicroseconds是以微妙为单位,875微妙刚好0.875ms
digitalWrite(9, LOW); //给D9一个低电平
delay(46); //延迟46ms
delayMicroseconds(875); //延迟0.875ms
}
}
当arduino执行上面的程序时,会不断的执行loop里面的循环,每次loop的时候,都要循环6400次(前面讲过了),每次循环先给D9一个高电平,持续46.875ms,再给一个低电平,持续46.875ms,相当于6400个周期的方波信号,一个周期为93.75ms(和前面讲的一致),6400个周期总共需要6400*0.09375s=600s。此时,电机将以10分钟4周的方式工作(我在电机上做了标记测算过,基本准确)。
(3)扩展
前面只用到了TB6600的PUL,另外两个也很重要,ENA使能和DIR方向,ENA是是否为电机上电,DIR是控制电机转动的方向。我将ENA+和DIR+分别接入了D11和D10,ENA-和DIR-也接入了GND。DIR+给高电平时,电机将正向旋转,低电平为逆向旋转。特别注意这个ENA+,ENA+给高电平时电机不通电,此时可以随意转动电机轴,ENA+给低电平时电机通电,电机轴转不动。此时如何控制ENA和DIR呢?这就需要用外部触发了,也就是Arduino的外部中断,UNO R3只有两个外部中断输入口,D2和D3,当使用外部中断的时候,需要把D2和D3设置成上拉电阻模式(D2,D3持续高电平),然后在arduino里设置两个中断函数,分别在下降沿触发,一个用于控制ENA,一个用于控制DIR。随便写了个示例程序如下:
//宏定义,学过编程都知道,没学过你只要知道后面看到ENA,全部被11替换
#define ENA 11
#define DIR 10
#define PUL 9
#define ENA_INT 2
#define DIR_INT 3
//定义了两个全局变量,用于保存ENA和DIR状态,HIGH=1,LOW=0
char ENA_STATE = HIGH;
char DIR_STATE = LOW;
void setup() {
// put your setup code here, to run once:
pinMode(ENA, OUTPUT); //设置D11为ENA控制信号输出
pinMode(DIR, OUTPUT); //设置D10为DIR控制信号输出
pinMode(PUL, OUTPUT);
pinMode(ENA_INT, INPUT_PULLUP); //设置D2为上拉电阻状态,持续等于1
pinMode(DIR_INT, INPUT_PULLUP); //设置D3为上拉电阻状态,持续等于1
attachInterrupt(0, ena_blink, FALLING); //注册中断0(对应D2)为下降沿触发,参数2为中断服务函数,参数参说明为下降沿触发
attachInterrupt(1, dir_blink, FALLING); //注册中断1(对应D3)为下降沿触发,参数2为中断服务函数,参数参说明为下降沿触发
digitalWrite(ENA, ENA_STATE); //给ENA一个HIGH信号,进入LOOP函数时电机不上电
digitalWrite(DIR, DIR_STATE); //指定一个方向
}
//ENA的中断服务函数,当D2出现一个下降沿时,将触发此函数
//函数里判断了ENA状态,如果时HIGH则转LOW同时改变信号,如果时LOW则转HIGH
void ena_blink()
{
if(ENA_STATE==HIGH)
{
ENA_STATE = LOW;
digitalWrite(ENA, ENA_STATE);
}
else
{
ENA_STATE = HIGH;
digitalWrite(ENA, ENA_STATE);
}
}
//方向控制的中断服务函数,同理ENA中断服务
void dir_blink()
{
if(DIR_STATE==HIGH)
{
DIR_STATE = LOW;
digitalWrite(DIR, DIR_STATE);
}
else
{
DIR_STATE = HIGH;
digitalWrite(DIR, DIR_STATE);
}
}
//LOOP还是以前的电机控制部分
void loop() {
// put your main code here, to run repeatedly:
for(int i=0; i<200; i++)
{
digitalWrite(PUL, HIGH);
delayMicroseconds(1000);
//delay(150);
digitalWrite(PUL, LOW);
//delay(150);
delayMicroseconds(1000);
}
}
当讲上面的程序烧入arduino开发板后,电机开始是不会转动的,此时需要用我图中预留出来的那根绿色的线,去桶一下D2口,由于绿色线接地,所以D2马上会从高电平转低电平,此时出现一个下降沿,D2对应的ENA中断就会启动,改变了ENA信号
(4) 补充:
听取专家的建议,用时间中断代替了delay函数,重新写的代码如下:
char toggle = LOW; //用来作为标志
void setup() {
// put your setup code here, to run once:
pinMode(9, OUTPUT);
cli();
TCCR1A = 0; //使用TIMER1
TCCR1B = 0;
TCNT1 = 0; //计数器清0
OCR1A = 1464; //比较寄存器的值1464=16000000HZ/256/42.67HZ-1
TCCR1B |= (1 << WGM12); //CTC模式,比较计数器和比较寄存器的值相等则产生中断
TCCR1B |= (1 << CS12); //预分频256
TIMSK1 |= (1 << OCIE1A); //中断
sei();
}
ISR(TIMER1_COMPA_vect)
{
toggle = !toggle; digitalWrite(9, toggle);
}
void loop() {
// put your main code here, to run repeatedly:
}
最后:
上架还没搞完,先发点基础的内容,欢迎大家共同交流!
更新
上架了,测量孔位真是麻烦,不在同一个平面,最后发现齿轮装上去,大的齿轮根本不平,咬合问题很大,最后换成同步带轮,毕竟同步带轮的容错率高啊
|
|