[AT32M412]

【AT-START-M412测评】+大摆角距离检测 (3)

[复制链接]
546|5
手机看帖
扫描二维码
随时随地手机跟帖
jinglixixi|  楼主 | 2025-6-9 17:10 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2025-6-9 17:20 编辑

#申请原创#

前面介绍了基于步进电机的大摆角距离检测,但它只能完成单轴摆动的距离检测,要实现双轴摆动的距离检测在安装结构上会更为复杂些。
为此,可使用有双轴摆动结构的舵机组件来实现,见图10所示。
caa2daf0b5e2e10dec46aa91309f6a4a
图10 双轴舵机云台

为控制舵机的摆动,需要为其提供相应的PWM调节脉冲,从简化设计的角度出发,可选取双路PWM调节模块来解决该问题,该模块的功能结构如图11所示。
655b824df0639b5a1d0440bcd9212491
图11  双路PWM调节模块

该功能模块具有手动和串口这2种控制模式,在使用中为便于程序控制,是通过串口指令来进行控制处理。
在使用串口控制的模式下,其串口工作的波特率为9600bps。
通过串口可设置模块的工作频率及占空比。
设置工作频率的格式如图12所示,设置占空比的格式如图13所示。
361bccc8512b17dbf401b78eb7cbd8d6
图12 设置频率的格式

ffb5594959d68c1226676903e45213f6
图13 设置占空比的格式

以PWM调节模块控制双轴舵机云台的信号传递关系如图14所示。
f0dd369d740a46061503e81e3c779b8f
图14 信号传递关系

对于舵机来说,所用的型号为SG90,转动范围为180度,其转动角度与时间的关系如图15所示。
4e3717709a9e19472798c6d63580493a
图15 转角与时间关系

在使用过程中,需经计算和实际测试,将占空比设置在2%~13%之间时,即可产生0度~180度之间的12个角度状态。
经测试可知,占空比的数值越小则越向右转,数值越大则越向左转。占空比的数值越小则越向上转,数值越大则越向下转。
2f624fd441e145b53993bf40adf78374
图16 控制效果1

bc7ce8e04ea7f3def4e43f935c2e1580
图17 控制效果2

5f00b33ddcec02bfb2b2c32bb367d6e7
图18 控制效果3

da94e1b7962bd5f7cddb6af3c355ed9f
图19 控制效果4

在控制时,首先要将PWM1和PWM2的脉冲频率设置为50Hz,相应的指令为“S1F050”和“S2F050”,然后再设置PWM1和PWM2的占空比,其指令形式为“S1D007”和“S2D007”,即可将舵机调整到指定的状态。
在控制云台转动和超声波测距的情况下,需要USART1和USART2一起配合工作,其中USART1控制云台转动,USART2控制超声波测距。
2b117676c6b1a9dd656a136e94883a2d
图20 连接与测试

为此,实现控制功能的关键程序为:
uint8_t MLF[7]={'S','1','F','0','5','0','T'};
uint8_t MLP[7]={'S','1','D','0','0','2','T'};

uart_print_init(9600); // USART1
delay_ms(1500);
// 设置脉冲频率
//S1F050T
MLF[1]='1';
while(c<7)
{
while(usart_flag_get(USART1, USART_TDBE_FLAG) == RESET);
usart_data_transmit(USART1, (uint16_t) MLF[c]);
c++;
}
delay_ms(300);

c=0;
MLF[1]='2';
while(c<7)
{
while(usart_flag_get(USART1, USART_TDBE_FLAG) == RESET);
usart_data_transmit(USART1, (uint16_t) MLF[c]);
c++;
}
delay_ms(300);

// 云台进入初识状态
//S1D003T
c=0;
MLP[1]='1';
u=7
loop:
MLP[4]=u/10+'0';
MLP[5]=u%10+'0';
while(c<7)
{
while(usart_flag_get(USART1, USART_TDBE_FLAG) == RESET);
usart_data_transmit(USART1, (uint16_t) MLP[c]);
c++;
}
delay_ms(300);

//S2D003T
c=0;
MLP[1]='2';
MLP[5]='2';
while(c<7)
{
while(usart_flag_get(USART1, USART_TDBE_FLAG) == RESET);
usart_data_transmit(USART1, (uint16_t) MLP[c]);
c++;
}
delay_ms(500);

for(j=2;j<14;j++)
{
shuanxin();
//S1D00xT
MLP[1]='2';
MLP[4]=j/10+'0';
MLP[5]=j%10+'0';
delay_ms(20);

至此,整体的设计功能就完成了,相较于单轴的距离检测,其检测的范围要更加宽泛。

演示效果:



使用特权

评论回复
guijial511| | 2025-6-10 08:05 | 显示全部楼层
用线性轴式编码器来检测角度

使用特权

评论回复
jinglixixi|  楼主 | 2025-6-10 09:23 | 显示全部楼层
是一种检测角度的方法

使用特权

评论回复
Labyrinth| | 2025-6-12 13:30 | 显示全部楼层
可以丝滑一点吗,还是舵机的局限性,每次只能转一个角度?可以慢慢增加线性的那种。

使用特权

评论回复
jinglixixi|  楼主 | 2025-6-13 10:32 | 显示全部楼层
Labyrinth 发表于 2025-6-12 13:30
可以丝滑一点吗,还是舵机的局限性,每次只能转一个角度?可以慢慢增加线性的那种。 ...

可能是与舵机的局限性有关,每次只能转动一个不小的角度。

使用特权

评论回复
szt1993| | 2025-6-15 23:44 | 显示全部楼层
非常不错的创意,用通讯方式应该更加稳定

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

493

主题

2882

帖子

38

粉丝