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

[复制链接]
 楼主| jinglixixi 发表于 2025-6-8 00:03 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2025-6-8 11:58 编辑

#申请原创#

大摆角距离检测其在硬件方面主要由:AT32M412开发板、TFT显示屏、超声波测距模块、步进电机及电机驱动功能板所构成。
5. 距离检测
为进行非接触式距离检测,这里选取的是超声波测距模块。
通常情况下,这种模块是通过计算收发超声波脉冲来换算出物体间距离的。此外,还有一种则是通过串口发送指令来读取检测距离值,其外观如图5所示,鉴于使用的方便性,就选取该检测模块来测距。
7b00977bef8957f9807f9bd2278858ae
图5 超声波测距模块

704bca7e0374fb2ccab85181f26dd34d
图6 所用接口

在连接测距模块的情况下,通讯的波特率为9600bps,启动检测的指令为0x55,其检测效果如图7所示。
0ca80152a6e57ddbf6067a841e43ec47
图7检测结果

在接收的4字节数据中,第二和第三字节数据是检测值,第四字节则是校验码。以返回值是FF 06 D9DE 为例,0x7C5 = 1753,即检测值为  1753mm。
在与TFT显示屏配合的情况下,实现实时距离检测与显示的程序为:
  1. POINT_COLOR=RED;
  2. for(i= 2;i < 180; i+=2)
  3. {
  4. shuanxin();
  5. usart_data_transmit(USART2, 0X55);
  6. c=0;
  7. while(c < 4)
  8. {
  9. while(usart_flag_get(USART2, USART_RDBF_FLAG) == RESET);
  10. buffer[c++] = usart_data_receive(USART2);
  11. }
  12. l=buffer[1]*256+ buffer[2];
  13. LCD_ShowNum(40,base+8,i,3);
  14. LCD_ShowNum(240,base+8,l,4);
  15. POINT_COLOR=RED;
  16. LCD_DrawLine(Xcent,base +1 , 158*cos(radians(i))+Xcent,base - 158*sin(radians(i)));
  17. //move();    // 小角度转动处理
  18. delay_ms(400);
  19. POINT_COLOR=BLACK;
  20. LCD_DrawLine(Xcent,base +1 , 158*cos(radians(i))+Xcent,base - 158*sin(radians(i)));
  21. }
  22. fx(1);         //  复位处理

6. 步进电机转动及复位
为便于连接,步进电机与开发板的连接关系为:
MA---PB11
MB---PB12
MC---PB13
MD---PB14

0220613b25e7518d208fd59a2c048f70
图8 所用接口  

6da3f1396db1a11740622b13a641ea55
图9 连接关系

在添加步进电机的情况下,实现0.7角的微小转动函数为:
  1. void move(int n)
  2. {
  3. MDL;
  4. MAH;
  5. delay_ms(n);
  6. MBH;
  7. delay_ms(n);
  8. MAL;
  9. delay_ms(n);
  10. MCH;
  11. delay_ms(n);
  12. MBL;
  13. delay_ms(n);
  14. MDH;
  15. delay_ms(n);
  16. MCL;
  17. delay_ms(n);
  18. MAH;
  19. delay_ms(n);
  20. }

鉴于以前的模拟转动控制程序是以2度的转角为步进单位,故调用3次0.7度角步进函数即可达到约2度的步进效果,经修改实际的转动控制程序为:
  1. POINT_COLOR=RED;
  2. for(i= 2;i < 180; i+=2)
  3. {
  4.           shuanxin();
  5.           usart_data_transmit(USART2, 0X55);
  6.           c=0;
  7.           while(c < 4)
  8.           {
  9.                 while(usart_flag_get(USART2, USART_RDBF_FLAG) == RESET);
  10.                 buffer[c++] = usart_data_receive(USART2);
  11.           }
  12.           l=buffer[1]*256+ buffer[2];
  13.           LCD_ShowNum(40,base+8,i,3);
  14.           LCD_ShowNum(240,base+8,l,4);         
  15.           POINT_COLOR=RED;
  16.           LCD_DrawLine(Xcent,base +1 , 158*cos(radians(i))+Xcent,base - 158*sin(radians(i)));
  17.           move();
  18.           move();
  19.           if((i%10)>0) move();
  20.           delay_ms(400);               
  21.           POINT_COLOR=BLACK;
  22.           LCD_DrawLine(Xcent,base +1 , 158*cos(radians(i))+Xcent,base - 158*sin(radians(i)));
  23. }
  24. fx(1);

至此,整体的功能设计就基本完成了,后续的工作是对传动结构进行连接和调整。


效果演示:

yangxiaor520 发表于 2025-6-9 08:49 来自手机 | 显示全部楼层
这种步进电机也是老物件了
 楼主| jinglixixi 发表于 2025-6-9 09:42 | 显示全部楼层
哈哈,再久点恐怕会有收藏价值。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

518

主题

2933

帖子

39

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