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

【经验分享】stm32f1系列单片机实战应用

[复制链接]
STMCU小助手 发布时间:2021-11-26 17:00
测量运动自行车速度,上传给上位机软件,处理VR视频播放。正好公司有现成的stm32f1系列单片机开发板,所以我就想到了使用它来实现这个小功能。

1. 硬件配置:

1.1. 运动自行车;

20180409144730202.png


1.2. 磁感应开关与专用磁铁;   

20180409144808136.png 20180409144818159.png


1.3. 基于Stm32f103zet6芯片的开发板(七星虫),如下图;

20180409144832248.png


1.4. 连接线若干;

1.5. miniusb线缆,用于给开发板供电及串口通信。

20180409144846453.png


2. 系统描述与框图:

运动自行车车轮上安装5只磁铁,通过磁感应开关检测磁铁产生信号,接入stm32开发板PE0引脚。测量出的速度值通过串口发送给PC上位机软件(mini usb线缆连接)。硬件框图如下:

2018040914485823.png



3. 软件实现

3.1.设定开发板PE0引脚下降沿中断,在引脚中断服务函数里累计中断次数(即磁感应开关感应到磁铁的次数),同时每累计10次LED2交换一次状态。外部初始化代码及中断服务函数如下:

  1. void EXTIX_Init(void)
  2. {
  3.     EXTI_InitTypeDef EXTI_InitStructure;
  4.     NVIC_InitTypeDef NVIC_InitStructure;
  5.     GPIO_InitTypeDef GPIO_InitStructure;
  6.     //  引脚端口初始化 PE0
  7.     GPIO_InitStructure.GPIO_Pin  = DEF_BIT_00;
  8.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  9.     GPIO_Init(GPIOE, &GPIO_InitStructure);   
  10.      // 启 AFIO 时钟
  11.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
  12.     //GPIOE.0 中断线以及中断初始化配置,下降沿触发
  13.     GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource0);// 配置中断线为0
  14.     EXTI_InitStructure.EXTI_Line=EXTI_Line0;
  15.     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  16.     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 下降沿触发
  17.     EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  18.     EXTI_Init(&EXTI_InitStructure); // 初始化中断线参数

  19.     NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;                //使能按键外部中断通道
  20.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;    //抢占优先级 2,
  21.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;           //子优先级 2
  22.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                 //使能外部中断通道
  23.     NVIC_Init(&NVIC_InitStructure);                                 // 初始化 NVIC
  24. }
  25. // 外部中断0服务程序
  26. long long lSpeedCnt = 0;
  27. void EXTI0_IRQHandler(void)
  28. {
  29.     OSIntEnter();             // 告诉ucosii系统进入中断

  30.     if(GPIO_ReadInputDataBit(GPIOE, DEF_BIT_00)==0) // PE0检测到下降沿
  31.     {
  32.         // 累计中断次数,每隔10次改变led1状态
  33.         if(!((lSpeedCnt++)%10))
  34.         {
  35.             BSP_LED_Toggle(2);
  36.         }
  37.     }
  38.     EXTI_ClearITPendingBit(EXTI_Line0); // 清除LINE0上的中断标志位

  39.     OSIntExit             // 告诉ucosii系统退出中断
  40. }
复制代码


3.2.在启用一个定时器中断,周期为1s,在定时器中断服务函数里计算自行车的速度。计算方式如下:v = p / μ * C,其中:v是速度:m/s,p是磁感应开关感应频率, μ为车轮上安装磁铁个数:5,C为自行车车轮周长:1.38m。定时器中断初始化代码及中断服务函数如下:

  1. /*******************************************************************************
  2. * Function Name  : BSP_TIM2_Init
  3. * Description    : Compute return latest speed measurement
  4. * Input          : None
  5. * Output         : s16
  6. * Return         : Return the speed in 0.1 Hz resolution.                    
  7. *******************************************************************************/
  8. static void BSP_TIM2_Init(u16 arr, u16 psc)
  9. {
  10.     TIM_TimeBaseInitTypeDef   bsp_tim2_init;   

  11.     //使能TIM2时钟
  12.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);


  13.     TIM_DeInit(TIM2);
  14.     TIM_TimeBaseStructInit(&bsp_tim2_init);
  15.     //TIM2初始化
  16.     bsp_tim2_init.TIM_Prescaler = psc;                                          //时钟预分频   定时器每隔 (psc+1)/72 us计数一次
  17.     bsp_tim2_init.TIM_CounterMode = TIM_CounterMode_Up;                         //向上计数
  18.     bsp_tim2_init.TIM_Period = arr;                                             //计数满(arr+1)次更新重装载寄存器数据
  19.     bsp_tim2_init.TIM_ClockDivision = TIM_CKD_DIV1;                             //时钟不分频
  20. //    bsp_tim2_init.TIM_RepetitionCounter = ;                                   //高级定时器用,这里不需设置
  21.     TIM_TimeBaseInit(TIM2, &bsp_tim2_init);                                     //初始化定时器

  22.     //设置定时器TIM2中断
  23.     TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);                                  //设置定时器更新中断
  24.     TIM_ClearITPendingBit(TIM2, TIM_IT_Update);                                 //清除中断标志,防止刚上电时进一次中断

  25.     //初始化中断
  26.     BSP_NVIC_Init(TIM2_IRQn, 3, 3);

  27.     //使能定时器TIM2
  28.     TIM_Cmd(TIM2, ENABLE);
  29. }
复制代码
  1. long long lvalCur;
  2. long long lValPrev;
  3. float fSpeedVal;
  4. void TIM2_IRQHandler(void)
  5. {
  6.     OSIntEnter();             // 告诉ucosii系统进入中断

  7.     if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
  8.     {      
  9.       extern long long lSpeedCnt;

  10.       lvalCur = lSpeedCnt;
  11.       fSpeedVal = (float)lvalCur - (float)lValPrev;
  12.       fSpeedVal /= 5.0;
  13.       fSpeedVal *= 1.38;      
  14.       lValPrev = lvalCur;
  15.       TIM_ClearFlag(TIM2, TIM_IT_Update);
  16.     }
  17.     OSIntExit();             // 告诉ucosii系统退出中断

  18. }
复制代码

3.3.系统共有两个任务,其中一个任务每50ms发送一次速度值给PC机,另一个控制LED1闪烁,周期100ms,用于指示系统正常运行。

第一个任务中运行代码如下:

  1. while(DEF_TRUE)
  2.     {              
  3.         extern float fSpeedVal;
  4.         if((int)(fSpeedVal*100) > 9999)
  5.         {
  6.             printf("9999");
  7.         }
  8.         else if((int)(fSpeedVal*100) > 999)
  9.         {
  10.             printf("%d",(int)(fSpeedVal*100));
  11.         }
  12.         else if((int)(fSpeedVal*100) > 99)
  13.         {
  14.             printf("0%d",(int)(fSpeedVal*100));
  15.         }
  16.         else if((int)(fSpeedVal*100) > 9)
  17.         {
  18.             printf("00%d",(int)(fSpeedVal*100));
  19.         }
  20.         else
  21.         {
  22.             printf("000%d",(int)(fSpeedVal*100));
  23.         }     

  24.         OSTimeDlyHMSM(0, 0, 0, 80);
  25.     }        
复制代码

第二个任务中代码如下:

  1. while (DEF_TRUE)
  2.     {     
  3.         BSP_LED_Toggle(1);  
  4.         OSTimeDlyHMSM(0, 0, 0, 100);
  5.     }
复制代码

整体运行稳定,满足项目需求。


收藏 评论0 发布时间:2021-11-26 17:00

举报

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