你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32感应垃圾桶

[复制链接]
STMCU小助手 发布时间:2022-10-27 14:34
STM32感应垃圾桶
学习最重要的是学会学以致用,基于学习的一些简单串口、定时器、中断…
来做一个简单的感应垃圾桶,在制作过程中也提高了自己调试能力,虽然说是简单的串口打印测试还是花了很久时间,感谢自己的坚持和学长的帮助。最终还是成功完成了该小项目(冲冲冲)

所需硬件

A}Q[}L$ATVUIHM(Z26]3GXC.png

  1. //1.HCSR04  配置部分
  2. #include "stm32f10x.h"
  3. //宏定义相应的引脚
  4. #define HCSR04_PORT     GPIOB
  5. #define HCSR04_CLK      RCC_APB2Periph_GPIOB
  6. #define HCSR04_TRIG     GPIO_Pin_11
  7. #define HCSR04_ECHO     GPIO_Pin_10



  8. //定义一个变量来记录定时器的值
  9. u16 msHcCount = 0;

  10. //中断配置
  11. void hcsr04_NVIC()
  12. {
  13.         NVIC_InitTypeDef NVIC_InitStructure;
  14.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  15.                         
  16.         NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;            
  17.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
  18.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;         
  19.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;      
  20.         NVIC_Init(&NVIC_InitStructure);
  21. }

  22. //超声波配置¯
  23. void Hcsr04Init()
  24. {  
  25.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;    //定时器结构体
  26.     GPIO_InitTypeDef GPIO_InitStructure;              //GPIO结构体
  27.     RCC_APB2PeriphClockCmd(HCSR04_CLK, ENABLE);       //时钟使能
  28.     // trig pb11
  29.     GPIO_InitStructure.GPIO_Pin =HCSR04_TRIG;      
  30.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  31.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  32.     GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);
  33.     GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);

  34.      //echo pb10
  35.     GPIO_InitStructure.GPIO_Pin =   HCSR04_ECHO;     
  36.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  37.     GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);  
  38.     GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO);   


  39.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);   //定时器时钟

  40.     TIM_DeInit(TIM2);
  41.     TIM_TimeBaseStructure.TIM_Period = (1000-1);
  42.     TIM_TimeBaseStructure.TIM_Prescaler =(72-1);
  43.     TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  44.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  45.                
  46.     TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);         
  47.     TIM_ClearFlag(TIM4, TIM_FLAG_Update);  
  48.     TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);      //定时器中断配置这个千万不要忘记配置了
  49.     hcsr04_NVIC();
  50.     TIM_Cmd(TIM4,DISABLE);     
  51. }


  52. //打开定时器  
  53. static void OpenTimerForHc()  
  54. {
  55.    TIM_SetCounter(TIM4,0);  //初始化开始计数
  56.    msHcCount = 0;
  57.    TIM_Cmd(TIM4, ENABLE);
  58. }

  59. //关闭定时器
  60. static void CloseTimerForHc()   
  61. {
  62.    TIM_Cmd(TIM4, DISABLE);
  63. }

  64. //定时器4中断函数
  65. void TIM4_IRQHandler(void)  
  66. {
  67.    if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)  
  68.    {
  69.        TIM_ClearITPendingBit(TIM4, TIM_IT_Update  );
  70.        msHcCount++;
  71.    }
  72. }


  73. //获取时间
  74. u32 GetEchoTimer(void)
  75. {
  76.    u32 t = 0;
  77.    t = msHcCount*1000;
  78.    t += TIM_GetCounter(TIM4);
  79.    TIM4->CNT = 0;  
  80.    delay_ms(50);
  81.    return t;
  82. }

  83. //计算测量距离
  84. float Hcsr04GetLength(void )
  85. {
  86.    u32 t = 0;
  87.    int i = 0;
  88.    float lengthTemp = 0;
  89.    float sum = 0;
  90.    while(i!=5)
  91.    {
  92.       TRIG_Send = 1;      
  93.       delay_us(20);
  94.       TRIG_Send = 0;
  95.       while(ECHO_Reci == 0);      
  96.       OpenTimerForHc();        
  97.       i = i + 1;
  98.       while(ECHO_Reci == 1);
  99.       CloseTimerForHc();        
  100.       t = GetEchoTimer();        
  101.       lengthTemp = ((float)t/58.0);//cm
  102.       sum = lengthTemp + sum ;

  103.     }
  104.     lengthTemp = sum/5.0;
  105.     return lengthTemp;
  106. }
复制代码

SG90配置

  1. //motor.h
  2. #include "stm32f10x.h"
  3. void Motor_Init(void);
复制代码
  1. //SG90.c

  2. #include "motor.h"
  3. #include "stm32f10x.h"


  4. void Motor_Init(void)
  5.         
  6. {
  7.         
  8.         //GPIO结构体配置
  9.         GPIO_InitTypeDef   GPIO_Config;
  10.         
  11.         //定时器结构体
  12.         TIM_TimeBaseInitTypeDef  TIME_Config;
  13.         
  14.         //复用配置
  15.         TIM_OCInitTypeDef    TIMEPWM_Config ;
  16.         
  17.         //时钟使能
  18.     RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
  19.     RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3 , ENABLE);
  20.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO , ENABLE);
  21.          
  22.      GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3 ,ENABLE); //部分映射

  23.         
  24.         GPIO_Config.GPIO_Mode  =   GPIO_Mode_AF_PP ;//¸´ÓÿªÂ¥
  25.         GPIO_Config.GPIO_Pin   =   GPIO_Pin_5 ;
  26.         GPIO_Config.GPIO_Speed =   GPIO_Speed_50MHz;
  27.     GPIO_Init( GPIOB,  &GPIO_Config);
  28.         
  29.         
  30.         TIME_Config.TIM_ClockDivision   =   TIM_CKD_DIV1  ;  
  31.         TIME_Config.TIM_CounterMode     =   TIM_CounterMode_Up  ;
  32.         TIME_Config.TIM_Period          =   200 - 1;  
  33.         TIME_Config.TIM_Prescaler       =   7200 - 1;  
  34.     TIM_TimeBaseInit( TIM3, &TIME_Config);



  35.         TIMEPWM_Config .TIM_OCMode       =   TIM_OCMode_PWM1 ;  
  36.         TIMEPWM_Config .TIM_OutputState  =   TIM_OutputState_Enable ;   
  37.         TIMEPWM_Config .TIM_OCPolarity   =   TIM_OCPolarity_Low ;
  38.         
  39.     TIM_OC2Init( TIM3, &TIMEPWM_Config);
  40.     TIM_OC2PreloadConfig( TIM3, TIM_OCPreload_Enable);
  41.         TIM_Cmd( TIM3, ENABLE);

  42. }
复制代码

Usart串口代码

  1. //Usart.h

  2. #include"stm32f10x.h"
  3. void Usart_Init(void);
复制代码
  1. #include "usart.h"
  2. #include "stm32f10x.h"


  3. void Usart_Init(void)
  4. {
  5.         
  6.         GPIO_InitTypeDef   Gpio_Init;   
  7.         USART_InitTypeDef  Usart_Init ;
  8.         
  9.         NVIC_InitTypeDef nvic_init;  
  10.         
  11.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);   
  12.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO ,ENABLE);  
  13.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 ,ENABLE);
  14.         
  15.         
  16.         //tx A9
  17.         
  18.         Gpio_Init.GPIO_Mode   =   GPIO_Mode_Out_PP;
  19.         Gpio_Init.GPIO_Pin    =   GPIO_Pin_9   ;
  20.         Gpio_Init.GPIO_Speed  =   GPIO_Speed_50MHz;
  21.         GPIO_Init(GPIOA ,&Gpio_Init);   //³õʼ»¯GPIO
  22.         
  23.         
  24.         //rx A10
  25.         Gpio_Init.GPIO_Mode   =    GPIO_Mode_IN_FLOATING;
  26.         Gpio_Init.GPIO_Pin    =    GPIO_Pin_10 ;
  27.         GPIO_Init(GPIOA ,&Gpio_Init);
  28.         
  29.         Usart_Init.USART_BaudRate     =  115200;  
  30.         Usart_Init.USART_HardwareFlowControl  = USART_HardwareFlowControl_None  ;
  31.         Usart_Init.USART_Mode        =   USART_Mode_Rx  | USART_Mode_Tx  ;  /
  32.         Usart_Init.USART_Parity      =   USART_Parity_No ;  
  33.         Usart_Init.USART_StopBits    =   USART_StopBits_1;
  34.         Usart_Init.USART_WordLength  =   USART_WordLength_8b ;  
  35.         
  36.         USART_Init (USART1 , &Usart_Init);  
  37.         USART_ITConfig( USART1,  USART_IT_RXNE  , ENABLE);
  38.         USART_Cmd (USART1 ,ENABLE );   
  39.         
  40.         
  41.         
  42.          nvic_init.NVIC_IRQChannel    =   EXTI1_IRQn;
  43.          nvic_init.NVIC_IRQChannelCmd  = ENABLE ;
  44.          nvic_init.NVIC_IRQChannelPreemptionPriority =1;
  45.          nvic_init.NVIC_IRQChannelSubPriority   = 1;

  46.           NVIC_Init(&nvic_init);
  47.                
  48.         
  49. }


  50. //打印当个字符
  51. void  USARTSendChar(USART_TypeDef* USARTx, uint16_t Data)
  52. {
  53.         
  54.         USART_SendData(USARTx, Data);
  55.         while(USART_GetFlagStatus(USARTx  ,USART_FLAG_TXE ) == RESET);
  56.         
  57. }



  58. //字符串
  59. void  UsartSendStr(USART_TypeDef* USARTx, char *str)
  60. {
  61.         uint16_t i=0;
  62.         do
  63.         {
  64.                  USARTSendChar(USARTx ,*(str+i));
  65.                  i++;
  66.         }while(*(str+i)!='\0');
  67.         
  68.         while(USART_GetITStatus( USARTx,USART_FLAG_TC) == RESET) ;  //判断是否接受完成

  69. }

  70. //重定义Printf
  71. int fputc(int ch, FILE *f)
  72. {
  73.         
  74.         USART_SendData(USART1 ,(uint8_t )ch);
  75.         while(USART_GetFlagStatus(USART1  ,USART_FLAG_TXE ) == RESET);
  76.         return (ch);
  77. }


  78. int fgetc(FILE *f)
  79. {
  80.         while(USART_GetFlagStatus(USART1  ,USART_FLAG_RXNE  ) == RESET);
  81.         
  82.         return (int)(USART_ReceiveData(USART1));
  83. }
复制代码

main.c主函数

  1. #include "stm32f10x.h"
  2. #include "usart.h"         
  3. #include "motor.h"
  4. #include "hcsr04.h"

  5.          
  6. //主函数
  7. int main(void)
  8. {         
  9.          float length;
  10.          int pwmval = 195 ;
  11.          delay_init();                     //延时函数初始化  
  12.          NVIC_Configuration();          //设置NVIC中断分组
  13.          Hcsr04Init();
  14.          Motor_Init();  
  15.          printf("xaio yin serial test\r\n");  

  16.      Hcsr04Init();   
  17.      printf("超声波初始化成功!\n");

  18.    while(1)
  19.          {               
  20.                  pwmval = 155 ;  //设定最初舵机值
  21.          length = Hcsr04GetLength();
  22.          printf("%.3fcm\n\n",length);  //打印距离
  23.                  printf("\n");
  24.                  delay_ms(1000);  
  25.                  if(length < 5)
  26.                  {
  27.                                 for (pwmval = 195 ; pwmval >= 155 ; pwmval -=15)
  28.                          {
  29.                                  
  30.                                    TIM_SetCompare2(TIM3 , pwmval);
  31.                                    delay_ms(1000);
  32.                          }
  33.                  }
  34.                                 else if( pwmval >5)
  35.                                 {
  36.                                         TIM_SetCompare2(TIM3 , pwmval -20);
  37.                                          delay_ms(1000);
  38.                                 }
  39.                         
  40.            }                        
  41.   }
复制代码





————————————————
版权声明:@slow-walker

收藏 评论0 发布时间:2022-10-27 14:34

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版