迪文科技论坛

 找回密码
 立即注册
搜索
查看: 282|回复: 0

【分享】迪文屏二次开发之雷达(超声波+舵机)

[复制链接]

3

主题

3

回帖

44

积分

新手上路

Rank: 1

积分
44
发表于 2023-12-20 14:10:18 | 显示全部楼层 |阅读模式
超声波可以看前面发的迪文屏二次开发之超声波传感器帖子
舵机模块讲解:



硬件电路连接:Trig连接P2^1 Echo连接P2^0 VCC连接5V pwm黄线连接P1^7
接线:
红色----VCC
棕色----GND
橙色----信号线(连接到单片机输出PWM的引脚)
对180°的舵机来说,舵机的控制一般需要一个20ms的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分,对应控制180°舵机的0-180°,呈线性变化。
以180度角度伺服为例,那么对应的控制关系是这样的(t为高电平时间):
t=0.5ms(占空比2.5%)---------0°;
t=1.0ms(占空比5%)-----------45°;
t=1.5ms(占空比7.5%)---------90°;
t=2.0ms(占空比10%)---------135°;
t=2.5ms(占空比12.5%)-------180°;


UI设计(附在源码文件夹中):
导入背景图,生成32.icl文件,48.icl图标文件,控件添加数据变量。

添加图标旋转指示组件,变量地址设定为1004,设置旋转中心,角度值等参数

设置转动调节组件,地址也同样设定1004使数据同步,设置圆的参数

添加数据变量组件显示转动的角度值,地址同样设定为1004,整数类型要改变为3位



部分代码讲解:
  1. 主函数
  2. void main(void)
  3. {   
  4.         sys_init();//系统初始化        
  5.         time0Init();//超声波定时器0初始化
  6.         Timer1Init();//舵机定时器1初始化
  7.         while(1)
  8.         {
  9.                 Get_Val();
  10.                 if(val)   //如果数据有效
  11.                 {
  12.                         sys_write_vp(START_WIN_TEMP_VP,(u8*)&val,1);//将数据显示在控件
  13.                 }
  14.                 sys_read_vp(START_WIN_TEMP0_VP,(u8*)&val0,1); //读取仪表盘的值
  15.                 Use_Duoji(val0);  //根据数值控制舵机
  16.                 sys_delay_about_ms(300);
  17.         }
  18. }



  19. duoji.c

  20. #include "duoji.h"
  21. u8 time1C=0;
  22. u16 time1CC=0;
  23. u8 duojiflag0=0;
  24. u8 duojiflag=1;
  25. void Timer1Init(void)                //500微秒@11.0592MHz
  26. {
  27.         PORTDRV = 0x01;//驱动电流为8mA
  28.         P1MDOUT |= 0x80; //设置为推挽输出
  29.         TMOD |= 0x10;                //设置定时器模式
  30.         TL1 = 0x67;                //设置定时初值
  31.         TH1 = 0xDE;                //设置定时初值
  32.         TF1 = 0;                //清除TF1标志
  33.         TR1 = 1;                //定时器1开始计时
  34.         ET1=1;   //开启定时器1中断
  35.         EA=1;                 //开启总中断
  36. }

  37. void duojitiao(u8 angle)//判断角度,将数据给影子变量
  38. {
  39.         if(angle==0)
  40.         {
  41.                 duojiflag0=1;
  42.         }
  43.         if(angle==45)
  44.         {        
  45.                 duojiflag0=2;
  46.         }        
  47.         if(angle==90)
  48.         {
  49.                 duojiflag0=3;
  50.         }
  51.         if(angle==135)
  52.         {
  53.                 duojiflag0=4;
  54.         }
  55.         if(angle==180)
  56.         {
  57.                 duojiflag0=5;
  58.         }
  59. }

  60. void Use_Duoji(u16 val0)
  61. {
  62.                 if(val0<20) duojitiao(0); //判断数值
  63.                 else if(val0<45) duojitiao(45);
  64.                 else if(val0<90) duojitiao(90);
  65.                 else if(val0<135) duojitiao(135);
  66.                 else if(val0<180) duojitiao(180);
  67. }

  68. void timer1() interrupt 3//定时器1的中断
  69. {
  70.         TL1 = 0x67;                //设置定时初值
  71.         TH1 = 0xDE;                //设置定时初值
  72.         if(time1C<duojiflag)//产生周期为20ms的pwm波
  73.         {
  74.                 DJ=1;
  75.         }
  76.         else DJ=0;
  77.         time1C++;  //time1C++为500us
  78.         
  79.         //time1C为40等于20ms,清零,重新产生pwm
  80.         if(time1C>=40)
  81.         {
  82.                 time1C=0;
  83.                 duojiflag=duojiflag0; //等待周期结束后,将影子变量的值给pwm的CCR
  84.         }
  85. }


  86. //代码中使用的时大于45度才会转动只提供演示效果,可以根据自己需求改变实际触发的角度值,比如8°为转动的一个幅度等,只要满足20ms中0.5ms-2.5ms,0-180度的线性对应即可
复制代码


效果演示:
转动舵机前:

旋转改变舵机转动角度:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-11-23 06:46 , Processed in 0.075014 second(s), 24 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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