打印
[资料分享]

[RTOS] rtthread移植到雅特力AT32F403A驱动步进电机

[复制链接]
3176|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cszzlsw|  楼主 | 2020-5-17 16:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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篇,后续还有没有视时间和精力而定,没错,我就是冲礼品来的嘻嘻
最后,时间仓促,疏漏指出难免,敬请大家回帖指出.



使用特权

评论回复

相关帖子

沙发
21ic小喇叭| | 2020-5-22 14:41 | 只看该作者
感谢分享,期待您完成作品~

如果使用过程中遇到问题,您可以电话联系板子厂家的客服,或者我们帮您询问一下厂家

小喇叭提醒您:

现在起到6月底,在21ic提交作品(记得把方案文档,作为附件上传),每个人都可以兑换3次礼物。

最晚7月5号以前提交作品哦

使用特权

评论回复
板凳
21ic小喇叭| | 2020-6-5 11:34 | 只看该作者
大大,我看您写的非常专业,您如果完成了作品,千万别忘记按比赛要求,做成文档,上传到论坛

文档模板在咱们参赛群里有,如果没找到,联系大掌柜单独发给您

提交作品以后,大掌柜给您寄礼品

使用特权

评论回复
地板
渔夫的烟斗| | 2020-6-7 22:17 | 只看该作者
想问一下雅特力芯片的最小系统去哪里找啊?官网上没有提供

使用特权

评论回复
评论
cszzlsw 2020-6-8 18:04 回复TA
开发板原理几乎就是最小系统了吧 都没什么外设 ,把几个led灯去掉 保留晶振 电源应该就是了 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

66

帖子

1

粉丝