多电机控制
工程训练IIB 风力摆A组-多电机控制
天津理工大学
作者:TheWindSing
版本:1.1
时间:2024-1-6
器件说明
主控单片机
型号:
STC89C52RC
参考:
宏晶 STC89C52RC 微控制器实践小书
51最小系统图:

接口图:

电机驱动芯片
型号:
TC1508A
实物图:

其他
功能实现
单电机单向控制
在Keil中新建STC工程:
一般直接安转完Keil软件中是没有STC的数据库,所以需要我们手动添加。
部分转载KEIL中怎样添加STC系列单片机
打开STC-ISP软件,然后点击Keil仿真设置,点击添加型号和头文件到Keil中 添加STC仿真器驱动到Keil中。
如下图:

之后弹出这个方框,选择好路径。

选择你Keil软件安装的路径!

打开Keil软件,选择新建工程,它就会弹出下面这个界面,这时候就可以选择STC MCU Database进行选择STC系列的单片机了。

选择STC89C52单片机:

代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit LED = P2^0;
void DelayMS(uint x) { uchar i; while(x--) { for(i=120;i>0;i--); } } void main() { while(1) { LED = ~LED; DelayMS(150); } }
|
单电机多向控制
实际上可以在Keil这个EDA软件里面直接修改然后写出多电机控制的程序
但是,这里建议采用VScode、Sublime Text、Notepad++等编辑器做进一开发,有利于代码编写和文件管理。
VScode教程:
下载Embedded IDE插件,还可以添加Copilot和C语言编程等插件

设置工具链:

依次新建好项目:



打开项目则需要切换到项目工作区:

控制一个电机正反方向旋转代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| #include<reg52.h> #define uint unsigned int #define uchar unsigned char
uchar time,count=100,flag=1;
sbit PWM1=P2^0; sbit PWM2=P2^1; sbit key_turn=P3^7;
void delayxms(uint z); void Motor_turn(void); void timer0_init(void);
void main(void) { timer0_init(); while(1) { Motor_turn(); } }
void delayxms(uint z) { uint x,y; for(y=z;x>0;x--) for(y=110;y>0;y--); }
void Motor_turn(void) { if(key_turn==0) { delayxms(2); if(key_turn==0)flag=~flag; while(!key_turn); } }
void timer0_init(void) { TMOD=0x01; TH0=(65536-10)/256; TL0=(65536-10)%256; TR0=1; ET0=1; EA=1; }
void timer0_int(void) interrupt 1 { TR0=0; TH0=(65536-10)/256; TL0=(65536-10)%256; TR0=1;
if(flag==1) { PWM1=0; time++; if(time<count)PWM2=1; else PWM2=0; if(time>=100)time=0; }
else { PWM2=0; time++; if(time<count) PWM1=1; else PWM1=0; if(time>=100)time=0; } }
|
电路布局:

这里由于器件限制省略了复位部分,器件充足的情况下最好加上。
多电机多向控制
Porteus画电路图:
由于Porteus没有STC89C52和TC1508等器件,可以用如AT89C52等其他类似器件代替,或者自己制作示意元件封装。
这里只需画出示意电路,故简单选择后者。
自己制作元件并进行封装
添加部分代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| sbit PWM1=P2^0; sbit PWM2=P2^1; sbit PWM3=P2^2; sbit PWM4=P2^3;
void timer0_int(void) interrupt 1 { TR0=0; TH0=(65536-10)/256; TL0=(65536-10)%256; TR0=1;
if(flag==1) { PWM1=0; PWM3=0; time++; if(time<count)PWM2=1; else PWM2=0; if(time>=100)time=0; }
else { PWM2=0; PWM4=0; time++; if(time<count) PWM1=1; else PWM1=0; if(time>=100)time=0; } }
|
电路图:

因为只有一个按钮,所以想控制多种运动方式只能直接自己上手拔线了。。。TUT
就此,通过手动拔线控制已经可以实现前后左右以及斜向45°八个方向的摆动了。