当前位置: 首页 > news >正文

STM32 出租车计价器系统设计(一) 江科大源码改写

STM32 出租车计价器系统设计

功能目标

驱动步进电机模拟车轮旋转,并实现调速功能。
设置车轮周长和单价,检测车轮转速和运转时间。
计算并显示行驶里程和价格。

硬件材料

28BYJ48 五线四相步进电机和 ULN2003 驱动板模块
测速传感器模块
嵌入式小系统STM32
电源模块

在这里插入图片描述

出租车计费规则假设:

unit_price:设置每圈的价格为 1 元。
distance_of_qibu:设定起步距离为 1000cm,起步价为 7.5 元。
price、distance:分别用于存储当前价格和行驶距离,初始值为 0。
circumference:假设车轮周长为 200cm

float unit_price = 1;
int distance_of_qibu = 1000;
float price = 0;
float distance = 0;
float circumference = 200;

OLED 显示初始化内容

OLED_ShowString(1, 1, "Speed:");
OLED_ShowString(2, 1, "unit_price:");
OLED_ShowString(2, 14, "r");
OLED_ShowString(3, 1, "distance:");
OLED_ShowString(4, 1, "price:");

while中 OLED更新显示

OLED_ShowNum(1, 12, Speed - 1, 3);
OLED_ShowNum(2, 13, unit_price, 1);
OLED_ShowNum(3, 10, distance, 5);
OLED_ShowFNum(4, 10, price, 4, 2);

OLED 界面
在这里插入图片描述

电机驱动

主要就是步进电机的控制,单片机IO口驱动能力较差,所以需要驱动模块
这里使用 ULN2003 驱动 步进电机28BYJ48

电机驱动代码

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "Key.h"
#include "Stepper.h"uint8_t STEP;	// 用于存储电机正在走过的整步编号
/*** @brief  步进电机输出端GPIO初始化函数* @param  无* @retval 无*/
void Stepper_GPIOInit(void)
{// 选择PA0,PA1,PA2,PA3分别为相A,B,C,D的输出RCC_APB2PeriphClockCmd(Stepper_CLK, ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;	// 推挽输出GPIO_InitStruct.GPIO_Pin = Stepper_LA | Stepper_LB | Stepper_LC | Stepper_LD;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(Stepper_Output_GPIO, &GPIO_InitStruct);GPIO_ResetBits(Stepper_Output_GPIO, Stepper_LA | Stepper_LB | Stepper_LC | Stepper_LD);
}/*** @brief  电机停转函数* @param  无* @retval 无*/
void Stepper_Stop(void)
{GPIO_ResetBits(Stepper_Output_GPIO, Stepper_LA | Stepper_LB | Stepper_LC | Stepper_LD);
}/*** @brief  4拍单相整步驱动函数* @param  StepNum 	整步编号,0~3对应A~D* @param	Delay_Time_xms 		每步旋转后延时时间x ms,用于控制步进电机速度(一般需大于等于2)* @retval 无*/
void Stepper_SingleStep(uint8_t StepNum, uint16_t Delay_Time_xms)
{switch(StepNum){case 0:		// AGPIO_WriteBit(Stepper_Output_GPIO, Stepper_LA, Bit_SET);GPIO_WriteBit(Stepper_Output_GPIO, Stepper_LB | Stepper_LC | Stepper_LD, Bit_RESET);break;case 1:		// BGPIO_WriteBit(Stepper_Output_GPIO, Stepper_LB, Bit_SET);	GPIO_WriteBit(Stepper_Output_GPIO, Stepper_LA | Stepper_LC | Stepper_LD, Bit_RESET);break;			case 2:		// CGPIO_WriteBit(Stepper_Output_GPIO, Stepper_LC, Bit_SET);	GPIO_WriteBit(Stepper_Output_GPIO, Stepper_LA | Stepper_LB | Stepper_LD, Bit_RESET);break;case 3:		// DGPIO_WriteBit(Stepper_Output_GPIO, Stepper_LD, Bit_SET);GPIO_WriteBit(Stepper_Output_GPIO, Stepper_LA | Stepper_LB | Stepper_LC, Bit_RESET);break;default: break;}Delay_ms(Delay_Time_xms);	// 延时,控制电机速度Stepper_Stop();				// 断电,防止电机过热
}/*** @brief  步进电机按步旋转* @param  direction		电机旋转方向,可以是Foreward(正传)或者Reversal(反转)* @param	step			电机转过的步数* @param	Delay_Time_xms	每步旋转后延时时间x ms,用于控制步进电机速度(一般需大于等于2)* @retval 无*/
void Stepper_RotateByStep(RotDirection direction, uint32_t step, uint16_t Delay_Time_xms)
{for (uint32_t i = 0; i < step; i ++){if (direction == Foreward)	// 电机正传{STEP ++;if (STEP > 3){STEP = 0;}}else if (direction == Reversal)	// 电机反转{if (STEP < 1){STEP = 4;}STEP --;}Stepper_SingleStep(STEP, Delay_Time_xms);}}/*** @brief  步进电机按整数圈旋转* @param  direction		电机旋转方向,可以是Foreward(正传)或者Reversal(反转)* @param  Loop			电机旋转的圈数* @param  Delay_Time_xms	每步旋转后延时时间x ms,用于控制步进电机速度(一般需大于等于2)* @retval */
int Stepper_RotateByLoop(RotDirection direction, uint32_t Loop, uint16_t Delay_Time_xms)
{Stepper_RotateByStep(direction, Loop * 2048, Delay_Time_xms);return Loop;
}
#ifndef __STEPPER_H_
#define __STEPPER_H_// 电机的旋转方向
typedef enum 
{Foreward = 0,Reversal = 1
} RotDirection;// 需要使用其他端口时,只需要更改以下的宏定义即可
// 这里需要保证四个输出端口同属一个GPIO
// 如果不能满足这一点,需要更改Stepper.c中初始化函数Stepper_Init和Stepper_RotateByStep中的一些变量名称
// 这里的宏定义是为了提高程序的可读性和可移植性,但使用stm32f10x.h中定义的原始名称也未尝不可
#define		Stepper_CLK				RCC_APB2Periph_GPIOA
#define		Stepper_Output_GPIO		GPIOA
#define 	Stepper_LA				GPIO_Pin_0
#define 	Stepper_LB				GPIO_Pin_1
#define 	Stepper_LC				GPIO_Pin_2
#define 	Stepper_LD				GPIO_Pin_3void Stepper_GPIOInit(void);
void Stepper_Stop(void);
void Stepper_SingleStep(uint8_t StepNum, uint16_t Delay_Time_xms);
void Stepper_RotateByStep(RotDirection direction, uint32_t step, uint16_t Delay_Time_xms);
int Stepper_RotateByLoop(RotDirection direction, uint32_t Loop, uint16_t Delay_Time_xms);#endif

上面是电机驱动.c .h文件 接线也很简单 看宏定义就可以,想要具体原理,可以看网上的资料

用杜邦线接线真的很麻烦,后面准备简单画一个PCB
在这里插入图片描述

通过按键实现电机调速,这边加上按键中断会比较好。因为步进电机的简单代码中,会有延时函数,导致按键没有被读到。
也可以通过PWM控制电机进行调速。

有问题可以私聊我

http://www.lryc.cn/news/503041.html

相关文章:

  • eclipse rcp-创建rcp-创建target
  • 微信小程序--创建一个日历组件
  • 质量问题分析与改进常见方法
  • 质数的和与积
  • 数据结构 (35)分配类排序
  • Cesium隐藏默认控件
  • Spark SQL 执行计划解析源码分析
  • rabbitMq举例
  • 奇怪的知识又增加了:ESP32下的Lisp编程=>ULisp--Lisp for microcontrollers
  • 渗透测试之信息收集
  • 基本分页存储管理
  • SQLServer到MySQL的数据高效迁移方案分享
  • 软考:工作后再考的性价比分析
  • shell编程(完结)
  • UNIX数据恢复—UNIX系统常见故障问题和数据恢复方案
  • adb连接逍遥安卓模拟器失败的问题解决方案
  • 【昇腾】NPU ID:物理ID、逻辑ID、芯片映射关系
  • Three.js曲线篇 8.管道漫游
  • scala基础_数据类型概览
  • 【LeetCode刷题之路】622.设计循环队列
  • 暂停一下,给Next.js项目配置一下ESLint(Next+tailwind项目)
  • Windows系统磁盘与分区之详解(Detailed Explanation of Windows System Disks and Partitions)
  • 顺序表的使用,对数据的增删改查
  • XDMA与FPGA:高效数据传输的艺术
  • #思科模拟器通过服务配置保障无线网络安全Radius
  • 浅谈Python库之pillow
  • Android通过okhttp下载文件(本文案例 下载mp4到本地,并更新到相册)
  • 计算机网络从诞生之初到至今的发展历程
  • Kudu 源码编译-aarch架构 1.17.1版本
  • SEC_ASA 第二天作业