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

[复制链接]
 楼主| 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 连接与测试

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

  3. uart_print_init(9600); // USART1
  4. delay_ms(1500);
  5. // 设置脉冲频率
  6. //S1F050T
  7. MLF[1]='1';
  8. while(c<7)
  9. {
  10. while(usart_flag_get(USART1, USART_TDBE_FLAG) == RESET);
  11. usart_data_transmit(USART1, (uint16_t) MLF[c]);
  12. c++;
  13. }
  14. delay_ms(300);

  15. c=0;
  16. MLF[1]='2';
  17. while(c<7)
  18. {
  19. while(usart_flag_get(USART1, USART_TDBE_FLAG) == RESET);
  20. usart_data_transmit(USART1, (uint16_t) MLF[c]);
  21. c++;
  22. }
  23. delay_ms(300);

  24. // 云台进入初识状态
  25. //S1D003T
  26. c=0;
  27. MLP[1]='1';
  28. u=7
  29. loop:
  30. MLP[4]=u/10+'0';
  31. MLP[5]=u%10+'0';
  32. while(c<7)
  33. {
  34. while(usart_flag_get(USART1, USART_TDBE_FLAG) == RESET);
  35. usart_data_transmit(USART1, (uint16_t) MLP[c]);
  36. c++;
  37. }
  38. delay_ms(300);

  39. //S2D003T
  40. c=0;
  41. MLP[1]='2';
  42. MLP[5]='2';
  43. while(c<7)
  44. {
  45. while(usart_flag_get(USART1, USART_TDBE_FLAG) == RESET);
  46. usart_data_transmit(USART1, (uint16_t) MLP[c]);
  47. c++;
  48. }
  49. delay_ms(500);

  50. for(j=2;j<14;j++)
  51. {
  52. shuanxin();
  53. //S1D00xT
  54. MLP[1]='2';
  55. MLP[4]=j/10+'0';
  56. MLP[5]=j%10+'0';
  57. 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 | 显示全部楼层
非常不错的创意,用通讯方式应该更加稳定
您需要登录后才可以回帖 登录 | 注册

本版积分规则

518

主题

2933

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部

518

主题

2933

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部