本帖最后由 cszzlsw 于 2020-5-17 17:07 编辑
1.开发板移植RTTHREAD
第一步,找到雅特力移植RTT的官方直播回放视频,地址:https://www.bilibili.com/video/BV1Yg4y1z7r5?t=122
第二步,看视频,并动手操作,温馨提示:看不懂的地方一定要多看几遍,个人认为讲视频的老师语速较慢,调成1.5倍舒服了
第三步,将原版官方工程拷贝一份,打开工程开始编码.
2.编写步进电机驱动:
1.步进电机驱动框架
本帖使用的是两相4线步进电机,电机采用8拍模式,对步进电机不明白的可以去网上搜索相关资料,这里贴出一篇大家加以参考:https://blog.csdn.net/ff_tt/article/details/78397811
以下是驱动代码,用我自己的风格写的,论坛对代码的排版一般,大家将就看
step_motor.c
#include "stepMotor.h"
#include <stdbool.h>
#include <stdio.h>
#include "rtthread.h"
对应的头文件:
#ifndef __STEP_MORTOR_H__
#define __STEP_MORTOR_H__
#include "at32f4xx_gpio.h"
#include "drv_gpio.h"
//typedef struct smotorIO_t{
// GPIO_Type *port;
// uint16_t pin;
//
//}smotorIO;
typedef struct step_motor_t{
rt_base_t motor_pins[4];
}step_motor;
void smotor_init(step_motor *motor);
void smotor_start(int deriction,step_motor *motor);
void smotor_stop(step_motor *motor);
#endif
好了我们的步进电机的驱动框架搭完了.
但是可能有同学会问,你这不对啊,你这怎么没有IO口信息呢,哈哈,不要急.
2.电机控制代码
pole.c
#include "pole.h"
//电机IO口定义,可提供多路电机的控制
static pole m_pole[]={
{
.motor={
.motor_pins={
GET_PIN(D, 2),
GET_PIN(D, 3),
GET_PIN(D, 4),
GET_PIN(D, 5),
}
}},
{.motor={
.motor_pins={
GET_PIN(B, 12),
GET_PIN(B, 13),
GET_PIN(B, 14),
GET_PIN(B, 15),
}
}}
};
int pole_num=sizeof(m_pole)/sizeof(pole);
// 注册杆子
int registerPole(){
for(int i=0;i<pole_num;i++){
smotor_init(&m_pole[i].motor);
}
return 0;
}
//获取电机头地址
pole *getPole(){
return m_pole;
}
对应的头文件为:
#ifndef _POLE_H_
#define _POLE_H_
#include <stdio.h>
#include "stepMotor.h"
#define POLE_DERECTION_OPEN 1
#define POLE_DERECTION_CLOSE 0
typedef struct pole_t{
step_motor motor;
}pole;
int registerPole();
pole *getPole();
int poleAction(int direction,pole *pole);
#endif
好了,我们的电机实例也做好了,接下来就是测试工作了.
3.主程序代码:
<blockquote>int main(void)
3.实验
1.先展示一下我们的电机和驱动模块:
2.将设备连在开发板上就是这样,这里我接了两路电机
3.编译程序,烧录,运行
可以看到由于main函数启动了电机,所以每次上电点击都会运行,所以我们可以用finsh命令行来执行测试
这里,本人给大家贴心准备了两种形式的命令行工具,代码在上面,这里再贴一次:
//finsh指令示例
int funcPoleAction(int direction,int road){
pole *p=getPoleByRoad(road);
if(p){
smotor_start(direction,&p->motor);
}else{
return -1;
}
return 0;
}
FINSH_FUNCTION_EXPORT(funcPoleAction,"finsh pole action!");//导出finsh指令
//cmd指令示例
int cmdPoleAction(int argc, char**argv){
printf("args:%s %s\n",argv[0],argv[1]);
if(argc<3){
printf("invalid arg,usage: cmdPoleAction up|down 0|1|2");
return -2;
}
int road = atoi(argv[2]);
pole *p=getPoleByRoad(road);
if(p){
if(rt_strcmp(argv[1],"up")==0){
poleAction(1,p);
}else if(rt_strcmp(argv[1],"down")==0){
poleAction(0,p);
}else{
printf("invalid arg,please use up or down!");
return -1;
}
}else{
printf("pole road error");
}
return 0;
}
MSH_CMD_EXPORT(cmdPoleAction,"msh pole action");//导出控制台cmd指令
打开终端试一下:
可以看到,指令都正确运行了,实际上我们的电机也动了.对应视频稍后上传
4.总结
RTTHREAD的确是一款优秀的rtos系统,本文小试牛刀,使用了rt_device的框架来操作IO口.
下一篇,估计是ds18b02读取温湿度,并显示在LCD1602屏幕上,大家拭目以待
再下一篇,预计是搭载ESP8266模块上个云,然后数据的上传接收这些,慢慢来
目前的规划就写3篇,后续还有没有视时间和精力而定,没错,我就是冲礼品来的嘻嘻
最后,时间仓促,疏漏指出难免,敬请大家回帖指出.
|