社区导航

 

搜索
查看: 559|回复: 2

[GD32E231 作品提交] 舵机控制器

[复制链接]

20

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-6-23 23:58 | 显示全部楼层 |阅读模式
本帖最后由 nemon 于 2019-6-24 02:35 编辑

先道个歉,最近2月有点特殊情况,时间没安排好,材料也没凑齐,周末坚持到3点焊好板子。然后眼皮彻底粘到了一起。还好早晨睁开了,只过去了半天,而不是一辈子。白天赶紧搞,终于在23:57把串口舵机控制器整出来了。下面就腆着脸介绍一下。

先来一张全家福:

微信图片_20190624004016.jpg

这次做的东西,是要控制舵机或者步进电机的,步进电机一般都用GPIO的脉冲驱动专门的驱动器,舵机只要按协议给PWM就可以了,上位机用UART与板子连接。整体结构如下:

图片1.png

 

uart的数据量非常小,每次只有8位,因此和缓存之间用的是中断,如果是市面上的舵机控制,一个命令就是一大长串,那就非用dma不可了。uart上传输的控制协议很简单,是一个8位无符号整数,其中高2位,用于表示几号舵机,低6位为0-63,表示把舵机的工作角度分成64个点,这样如果是180度舵机,每一份大约是2.85度,如果要求不太高,基本可以用。
所以中断处理【void USART0_IRQHandler(void)】是这样的:

if(SET == usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)){
	uint8_t c = usart_data_receive(USART0);
	setCommand(0xc0&c, c & 0x3f );
}

 

缓冲区用来存储命令,初始化成-1,这样可以知道是否有赋值:

#include "cmd.h"
volatile static int cmd[4] = {-1,-1,-1,-1};
void setCommand(int flag,int c){
	if(flag>=0 && flag<3){
		cmd[flag]=c;
	}
}
int getCommand(int flag){
	if(flag>=0 && flag<3){
		return cmd[flag] ;
	}else{
		return 0;
	}
}
void clearnCommand(int flag){
	if(flag>=0 && flag<3){
		cmd[flag]=-1;
	}
}

GPIO初始化就不多说了,TIMER的参数与后边有关,要解释一下:

timer_initpara.prescaler         = 72-1;
timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
timer_initpara.counterdirection  = TIMER_COUNTER_UP;
timer_initpara.period      		 = 20000-1;
timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
timer_initpara.repetitioncounter = 0;
timer_init(TIMER2,&timer_initpara);

舵机协议要求周期为20ms,因为系统时钟定义成72MHz,那么72M/72=72000000/72=1000000,则20000/1000000=20/1000;舵机的控制是在0.5-2.5ms之间即500-2500us之间,约等于(500+0)到(500+1980)us。

读取控制数据调整舵机的部分只有几行:

int agl=getCommand(serNo);
if(agl>=0){
	uint32_t pulsewidth = (11 * 180 * agl / 63) + 500;
	printf("%d->%d,\n", agl,pulsewidth);
	Servo_Val(pulsewidth,serNo);
}

其中Servo_Val是封装的这句话:

timer_channel_output_pulse_value_config(arry_TIMER[id],arry_TIMER_CH[id],20000- pause);

做出的效果是这样的:


 

在手忙脚乱地烧掉步进驱动和2个舵机之后,项目从“多电机并行控制”堕落成“串口舵机控制器”了,多亏看不到诸位鄙视的表情,不然还真不敢发帖。这次的收获是,通过这个项目大致了解了GPIO、TIMER和UART的DMA,pwm现在还是一知半解,借这个机会请教一下万能的网友——在哪里可以查到timer的channel和gpio的绑定关系?

 

又及:补一下提交要求的word文件

20190623GD32E231-nemon.docx (192.11 KB, 下载次数: 8)



回复

使用道具 举报

20

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2019-6-24 12:01 | 显示全部楼层

感谢和善同学,告诉我可以在数据手册2.6.1找到答案。

所以补充下用到的各种资料。

【1】Datasheet:

GD32E230xx_Datasheet_V1.2.pdf (1.83 MB, 下载次数: 4)



回复

使用道具 举报

5

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2019-6-25 11:24 | 显示全部楼层

谢谢分享

 



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 /6 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-9-21 02:09 , Processed in 0.121956 second(s), 18 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表