找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2809|回复: 1
打印 上一主题 下一主题
收起左侧

stm32f103rc单片机超声波控制舵机旋转代码

[复制链接]
跳转到指定楼层
楼主
ID:853162 发表于 2021-4-27 17:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
之前在学习stm32的时候接触到一个简单的项目--智能垃圾桶。通过研究它的原理发现其实是超声波模块HCSR04发射超声波接触到物体会返回并启动舵机的旋转。
单片机源程序如下:
  1. void PWM_Init()
  2. {
  3.         GPIO_InitTypeDef GPIO_InitStructure;   //声明一个结构体变量,用来初始化GPIO

  4.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//声明一个结构体变量,用来初始化定时器

  5.         TIM_OCInitTypeDef TIM_OCInitStructure;//根据TIM_OCInitStruct中指定的参数初始化外设TIMx

  6.         /* 开启时钟 */
  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  8.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
  9.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

  10.         /*  配置GPIO的模式和IO口 */
  11.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;// PA1
  12.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  13.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
  14.         GPIO_Init(GPIOA,&GPIO_InitStructure);
  15.         
  16.         //TIM3定时器初始化
  17.         TIM_TimeBaseInitStructure.TIM_Period = 1999; //PWM 频率=72000/(1999+1)=36Khz//设置自动重装载寄存器周期的值
  18.         TIM_TimeBaseInitStructure.TIM_Prescaler = 719;//设置用来作为TIMx时钟频率预分频值
  19.         TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;//设置时钟分割:TDTS = Tck_tim
  20.         TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;        //TIM向上计数模式
  21.         TIM_TimeBaseInit(TIM2, & TIM_TimeBaseInitStructure);

  22. //        GPIO_PinRemapConfig(GPIO_FullRemap_TIM2,ENABLE);//改变指定管脚的映射        //pC6

  23.         //PWM初始化          //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
  24.         TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;
  25.         TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//PWM输出使能
  26.         TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;

  27.         TIM_OC1Init(TIM2,&TIM_OCInitStructure);
  28.         //注意此处初始化时TIM_OC1Init而不是TIM_OCInit,否则会出错。因为固件库的版本不一样。
  29.         TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);//使能或者失能TIMx在CCR1上的预装载寄存器
  30.         TIM_Cmd(TIM2,ENABLE);//使能或者失能TIMx外设
  31. }




  32. void pwm(void)
  33. {
  34.                 delay_ms(500);
  35.                 TIM_SetCompare1(TIM2, 50);//0度
  36.                 delay_ms(1000);
  37.                 TIM_SetCompare1(TIM2, 100);//45度
  38.           delay_ms(1000);
  39.                 TIM_SetCompare1(TIM2,150);//90度
  40.                 delay_ms(1000);
  41.                 TIM_SetCompare1(TIM2, 200);//135度
  42.                 delay_ms(1000);
  43.                 TIM_SetCompare1(TIM2, 250);//180度
  44.                 delay_ms(100);
  45.         
  46. }
复制代码
这个是pwm舵机函数(sg90)
  1. #include "HCSR04.h"
  2. #include "sys.h"
  3. #include "delay.h"

  4. /*
  5. * 函数名:UltrasonicWave_Configuration
  6. * 描述  :超声波模块的初始化
  7. * 输入  :无
  8. * 输出  :无        
  9. */
  10. void UltrasonicWave_Configuration(void)
  11. {
  12.   GPIO_InitTypeDef GPIO_InitStructure;
  13.         
  14.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  15.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  16.   GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);  
  17.         
  18.         
  19.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                                         //PC8接TRIG
  20.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                     //设为推挽输出模式
  21.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 
  22.   GPIO_Init(GPIOB, &GPIO_InitStructure);                         //初始化外设GPIO

  23.         
  24.         

  25.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                                     //PC9接ECH0
  26.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;                 //设为输入
  27.   GPIO_Init(GPIOB,&GPIO_InitStructure);               
  28.         
  29. }

  30. /*
  31. * 函数名:UltrasonicWave_StartMeasure
  32. * 描述  :开始测距,发送一个>10us的脉冲,然后测量返回的高电平时间
  33. * 输入  :无
  34. * 输出  :无        
  35. */
  36. void UltrasonicWave_StartMeasure(void)
  37. {
  38.         Trig = 1;
  39.         delay_us(15);                                      //延时20US
  40.         Trig = 0;
  41. }
复制代码
这个是超声波模块函数
剩下的代码大家可以根据情况自行下载

注:我在整个超声波控制舵机代码运行时发现一个问题,就是在执行到舵机部分的时候就一直卡在那里,从硬件上看就是led0不会跳回到led1,但是有时可以有时又不可以,这个问题我也不知道怎么回事,遇到同样问题的大家可以一起解决。

全部程序51hei下载地址:
超声波控制舵机.7z (187.93 KB, 下载次数: 39)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:915610 发表于 2021-5-24 07:51 | 只看该作者
有原理图吗,请问?
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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