
中级技术员
 
- 积分
- 175
- 在线时间
- 59 小时
- 精华
- 0
- 注册时间
- 2013-9-24
- 最后登录
- 2021-1-20
|
本帖最后由 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篇,后续还有没有视时间和精力而定,没错,我就是冲礼品来的嘻嘻
最后,时间仓促,疏漏指出难免,敬请大家回帖指出.
|
  共2人点赞
|