最近有一个小项目,测量运动自行车速度,上传给上位机软件,处理VR视频播放。正好公司有现成的stm32f1系列单片机开发板,所以我就想到了使用它来实现这个小功能。

1. 硬件配置:

1.1. 运动自行车;

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

  

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

1.4. 连接线若干;

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

2. 系统描述与框图:

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

3. 软件实现

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

void EXTIX_Init(void)
{EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;//  引脚端口初始化 PE0GPIO_InitStructure.GPIO_Pin  = DEF_BIT_00;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOE, &GPIO_InitStructure);    // 启 AFIO 时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//GPIOE.0 中断线以及中断初始化配置,下降沿触发GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource0);// 配置中断线为0EXTI_InitStructure.EXTI_Line=EXTI_Line0;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 下降沿触发EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure); // 初始化中断线参数NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;                //使能按键外部中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;    //抢占优先级 2,NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;           //子优先级 2NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                 //使能外部中断通道NVIC_Init(&NVIC_InitStructure);                                 // 初始化 NVIC
}
// 外部中断0服务程序
long long lSpeedCnt = 0;
void EXTI0_IRQHandler(void)
{OSIntEnter();             // 告诉ucosii系统进入中断if(GPIO_ReadInputDataBit(GPIOE, DEF_BIT_00)==0) // PE0检测到下降沿{// 累计中断次数,每隔10次改变led1状态if(!((lSpeedCnt++)%10)){BSP_LED_Toggle(2);}}EXTI_ClearITPendingBit(EXTI_Line0); // 清除LINE0上的中断标志位OSIntExit             // 告诉ucosii系统退出中断
}

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

/*******************************************************************************
* Function Name  : BSP_TIM2_Init
* Description    : Compute return latest speed measurement
* Input          : None
* Output         : s16
* Return         : Return the speed in 0.1 Hz resolution.
*******************************************************************************/
static void BSP_TIM2_Init(u16 arr, u16 psc)
{TIM_TimeBaseInitTypeDef   bsp_tim2_init;    //使能TIM2时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);TIM_DeInit(TIM2);TIM_TimeBaseStructInit(&bsp_tim2_init);//TIM2初始化bsp_tim2_init.TIM_Prescaler = psc;                                          //时钟预分频   定时器每隔 (psc+1)/72 us计数一次bsp_tim2_init.TIM_CounterMode = TIM_CounterMode_Up;                         //向上计数bsp_tim2_init.TIM_Period = arr;                                             //计数满(arr+1)次更新重装载寄存器数据bsp_tim2_init.TIM_ClockDivision = TIM_CKD_DIV1;                             //时钟不分频
//    bsp_tim2_init.TIM_RepetitionCounter = ;                                   //高级定时器用,这里不需设置TIM_TimeBaseInit(TIM2, &bsp_tim2_init);                                     //初始化定时器//设置定时器TIM2中断TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);                                  //设置定时器更新中断TIM_ClearITPendingBit(TIM2, TIM_IT_Update);                                 //清除中断标志,防止刚上电时进一次中断//初始化中断BSP_NVIC_Init(TIM2_IRQn, 3, 3); //使能定时器TIM2TIM_Cmd(TIM2, ENABLE);
}
long long lvalCur;
long long lValPrev;
float fSpeedVal;
void TIM2_IRQHandler(void)
{OSIntEnter();             // 告诉ucosii系统进入中断if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET){      extern long long lSpeedCnt;lvalCur = lSpeedCnt;fSpeedVal = (float)lvalCur - (float)lValPrev;fSpeedVal /= 5.0;fSpeedVal *= 1.38;      lValPrev = lvalCur;TIM_ClearFlag(TIM2, TIM_IT_Update);}OSIntExit();             // 告诉ucosii系统退出中断}

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

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

 while(DEF_TRUE){              extern float fSpeedVal;if((int)(fSpeedVal*100) > 9999){printf("9999"); }else if((int)(fSpeedVal*100) > 999){printf("%d",(int)(fSpeedVal*100)); }else if((int)(fSpeedVal*100) > 99){printf("0%d",(int)(fSpeedVal*100)); }else if((int)(fSpeedVal*100) > 9){printf("00%d",(int)(fSpeedVal*100)); }else{printf("000%d",(int)(fSpeedVal*100)); }     OSTimeDlyHMSM(0, 0, 0, 80);}        

第二个任务中代码如下:

while (DEF_TRUE){     BSP_LED_Toggle(1);  OSTimeDlyHMSM(0, 0, 0, 100);}

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

stm32f1系列单片机实战应用相关推荐

  1. stm32cubemx无法生成工程_经验分享 | STM32CubeMX + STM32F1系列开发时遇到的四个问题及解决方案分享...

    这四个问题是我在使用STM32F103C8T6 + STM32CubeMX做项目时遇到的,给大家分享一下,以下四个问题重要程度依次降低,分别是: ① 调试选项问题(默认会造成下载器无法下载): ② 定 ...

  2. 经验分享 | STM32CubeMX + STM32F1系列开发时遇到的四个问题及解决方案分享

    这四个问题是我在使用STM32F103C8T6 + STM32CubeMX做项目时遇到的,给大家分享一下,以下四个问题重要程度依次降低,分别是: ① 调试选项问题(默认会造成下载器无法下载): ② 定 ...

  3. STC15单片机实战项目 - 项目需求

    以经典的51内核单片机设计一款产品,功能如下: 1.采用宏晶的STC15L2K32S2-LQFP32,2k SRAM,32k ROM: 目的:选用STC15系列1T的经典51内核单片机,资源丰富. 2 ...

  4. **浅谈STM32系列单片机的零基础学习方法**

    浅谈STM32系列单片机的零基础学习方法 *很多朋友想必在零基础学习STM32F1这系列单片机时会感觉无从下手,或者不知道写程序时到底是用库函数好还是寄存器好.* 我个人认为一个零基础的朋友可以通过以 ...

  5. STM32F1系列HAL库配置系统时钟

    STM32F1系列HAL库配置系统时钟 其实一开始对于时钟我也是知之甚少,在MSP432中我就一直忽视时钟配置,其实也是在STM32学习时落下的病根,现在趁有空补一下. 时钟简单讲解 对于时钟系统,在 ...

  6. 基于STM32F1系列和LDV5语音模块的语音控制LCD屏幕的点亮

    本文章是基于野火指南者F103板载LCD屏的控制,如有不妥之处,欢迎指正交流! 基于STM32F1系列和LDV5语言模块的语音控制LCD屏幕的点亮 前言 一.STM32外部中断EXTI 1.什么是外部 ...

  7. STM32F1系列超声波测距程序

    STM32F1系列超声波测距程序 因为自己做毕设的缘故,用到超声波HCSR04模块,在网上查找了相关的代码,发现关于超声波测距大体上有两种写法.在自己调试改进后,想把这两种方法都贴出来,和大家一起讨论 ...

  8. LiteOS移植到STM32F103系列单片机,非常简单

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 LiteOS移植到STM32F103系列单片机 前言 一.下载老版本liteos 二.参考官方的推荐移植步骤 1.新建项目 1.1打开 ...

  9. 对于初学者有关STM32F103系列单片机选择的建议

    这篇博客是针对于初学者选择STM32单片机的一些经济实惠的建议. STM32F1系列的单片机采用的是M3内核的,而STM32F4系列的采用的是M4内核的,相对来说M4内核的性能强于M3内核一些的,且其 ...

最新文章

  1. 亚马逊自动打包机:1机可顶24人
  2. 关于Git使用的一些心得
  3. Quartz.Net 使用
  4. Nginx 500错误总结
  5. 12306加密传输_前沿一键发送“文图音视频” 支持加密传输、图形密码、保护用户隐私……5G消息要来了!...
  6. java des算法_Java DES算法程序
  7. 【Matlab学习笔记】图像的二值化(待续)
  8. sfm点云代码_SfM实现过程分析
  9. 用HTML5制作简单的个人简历
  10. 人类数据总量_人类身体的11个极限数据
  11. 帝国CMS灵动标签如何调用父子栏目连接和名称导航
  12. PEGASUS: Pre-training with Extracted Gap-sentences for Abstractive Summarization论文笔记
  13. 屏幕小于6英寸的手机_6英寸是多大?6英寸是多少厘米?
  14. Linux-京东字节百度提前批,一面二面都被问到了awk——实例篇(2)去重统计排序
  15. 基于LSTM的情感识别在鹅漫电商评论分析中的实践与应用
  16. 计算机中ufc是什么意思中文,ufc是什么意思,ufc是什么意思中文
  17. Feign传输MultipartFile 报错 Error converting request body
  18. PDF文件只能打印出第一页
  19. 电子工程师名片——UFI Command,USB盘符的显示
  20. 视频存储价格高昂_避免5个最常见(且代价高昂)的错误,这些错误肯定会导致游戏出轨...

热门文章

  1. 分类图片展示php源码,HTML5+jQuery插件Quicksand实现超酷的星际争霸2兵种分类展示效果(附demo源码下载)...
  2. mysql添加字段自动记录加入时间、更新时间
  3. pytorch使用masked掩盖某些值(筛选值)
  4. 解决Dataframe删除操作时警告:SettingWithCopyWarning:A value is trying to be set on a copy of a slice from a...
  5. 替换掉(取消掉)pip freeze 生成的@ file:///格式,变为正常的==版本号
  6. 流水线合成材料依赖表的生成算法
  7. django-xadmin出现Models aren't loaded yet错误
  8. vant 上传附件后回显_Vue + VantUI Uploader 上传组件, 实现上传功能, 但 手机实时上传照片只回显, 上传不上去 。...
  9. 织梦dede:channelartlist调用排除指定typeid栏目
  10. 为什么 jmeter 分布式测试,一定要设置 java.rmi.server.hostname