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

基于STM32的电机控制器:Keil与Proteus的嵌入式之旅

stm32电机控制器,嵌入式单片机仿真,keil+proteus,带报告 1、keil源文件 2、proteus仿真 3、报告(26页详细报告,含ad原理图,pcb等) 设计一个直流电机控制系统,可控制电机启、停、正反转和转速,并可检测和显示电机实际转速。 设计基本要求: (1)设计电机驱动电路,电机额定电压12V。 (2)供电电源:控制系统主电源电压+5V,由USB接口供电;串口转USB与供电接口共用一个USB接口。 (3)电机调速:采集电位计电压,输出PWM对电机进行调速。 (4)正反转控制:采集两个开关信号,分别控制正转和反转。 (5)启、停控制:采集两个开关信号,分别控制启和停。 (6)工作状态指示:具有1个指示灯,不停亮灭。 (7)异常报警:具有1个指示灯,当电机转速大于150rad/分钟时,指示灯点亮,否则指示灯熄灭。

最近搞了个基于STM32的电机控制器项目,用Keil进行代码编写,Proteus实现仿真,还附带一份超详细的26页报告,里面AD原理图、PCB啥的都有,今天就来和大家唠唠。

一、Keil源文件那些事儿

咱这个直流电机控制系统,要实现电机启、停、正反转、转速控制以及实际转速检测显示,代码自然是关键。

首先,初始化GPIO口,用来连接各种外设,像开关、指示灯啥的。

void GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); // 配置控制电机启停、正反转的开关引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置工作状态指示灯引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置异常报警指示灯引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); }

这段代码里,先使能了GPIOA和GPIOB的时钟,然后针对不同功能的引脚进行配置。比如控制开关的引脚设为上拉输入模式,指示灯引脚设为推挽输出模式,速度设为50MHz ,这样能快速响应各种信号变化。

接着是PWM输出用于电机调速,这部分要初始化定时器。

void TIM3_PWM_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_TimeBaseStructure.TIM_Period = 999; TIM_TimeBaseStructure.TIM_Prescaler = 71; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM3, &TIM_OCInitStructure); TIM_Cmd(TIM3, ENABLE); }

这里用TIM3定时器,设置周期为999,预分频器为71 ,意味着PWM频率是10KHz ,比较适合直流电机调速。选择PWM1模式,输出使能,脉冲初始设为0 ,之后根据电位计采集的电压来调整脉冲宽度,实现调速。

在主函数里,不断读取开关状态,调整电机状态和PWM占空比。

int main(void) { uint8_t start_stop, forward_backward; uint16_t pot_value; GPIO_Init(); TIM3_PWM_Init(); while (1) { start_stop = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0); forward_backward = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1); pot_value = ADC_GetConversionValue(ADC1); TIM_SetCompare1(TIM3, pot_value / 4); if (start_stop) { // 启动电机 GPIO_SetBits(GPIOA, GPIO_Pin_4); } else { // 停止电机 GPIO_ResetBits(GPIOA, GPIO_Pin_4); } if (forward_backward) { // 正转逻辑 } else { // 反转逻辑 } // 检测电机转速并处理异常报警 if (get_motor_speed() > 150) { GPIO_SetBits(GPIOA, GPIO_Pin_5); } else { GPIO_ResetBits(GPIOA, GPIO_Pin_5); } // 工作状态指示灯闪烁逻辑 delay(500); GPIO_WriteBit(GPIOA, GPIO_Pin_4, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_4))); } }

这里读取启动停止和正反转开关状态,通过ADC获取电位计电压值,调整PWM占空比。根据开关状态控制电机启停和正反转,检测到电机转速大于150rad/分钟就点亮报警指示灯,工作状态指示灯通过延时实现闪烁。

二、Proteus仿真的奇妙世界

在Proteus里搭建仿真电路,首先电源部分按照要求,控制系统主电源 +5V 由USB接口供电,串口转USB与供电接口共用一个USB接口,这就需要合理连接VCC和GND。

stm32电机控制器,嵌入式单片机仿真,keil+proteus,带报告 1、keil源文件 2、proteus仿真 3、报告(26页详细报告,含ad原理图,pcb等) 设计一个直流电机控制系统,可控制电机启、停、正反转和转速,并可检测和显示电机实际转速。 设计基本要求: (1)设计电机驱动电路,电机额定电压12V。 (2)供电电源:控制系统主电源电压+5V,由USB接口供电;串口转USB与供电接口共用一个USB接口。 (3)电机调速:采集电位计电压,输出PWM对电机进行调速。 (4)正反转控制:采集两个开关信号,分别控制正转和反转。 (5)启、停控制:采集两个开关信号,分别控制启和停。 (6)工作状态指示:具有1个指示灯,不停亮灭。 (7)异常报警:具有1个指示灯,当电机转速大于150rad/分钟时,指示灯点亮,否则指示灯熄灭。

电机驱动电路,因为电机额定电压12V ,我用了L298N芯片,它能很好地驱动直流电机。将STM32的控制引脚连接到L298N的控制端,电机的正负极接到L298N的输出端。

电位计用来采集电压控制PWM,将电位计的中间引脚连接到STM32的ADC输入引脚。控制启停、正反转的开关一端接地,另一端连接到STM32的GPIO输入引脚。工作状态指示灯和异常报警指示灯正极接VCC,负极通过限流电阻连接到STM32的GPIO输出引脚。

仿真的时候,可以看到随着电位计旋转,电机转速改变,开关按下电机启停、正反转都能正常响应,指示灯也按照预期亮灭,这就说明硬件设计和软件代码配合得不错。

三、详细报告里的乾坤

这份26页的报告,AD原理图部分详细绘制了各个模块的连接关系,从电源到电机驱动,从STM32最小系统到各个外设接口,每一根线、每一个元件都标注得清清楚楚,方便后续制作PCB。

PCB设计则是根据原理图布局布线,考虑到电磁兼容性和信号完整性,合理规划元件位置,调整走线宽度和间距。比如电源走线加粗,避免电流过大发热,数字信号和模拟信号分开走线,减少干扰。

总之,通过Keil编写代码,Proteus进行仿真验证,再加上详细的报告记录整个设计过程,这个STM32电机控制器项目算是圆满完成,希望我的分享能给大家在类似项目上一些启发。

http://www.jsqmd.com/news/473717/

相关文章:

  • 鸿蒙中 应用的权限(一)
  • 心理聊天App 5款产品实测对比,哪个更适合情绪内耗的你?
  • 内存涨价、供应不稳?嵌入式工程师必看:适合轻量级项目ARM选型与存储避坑指南
  • GESP C++一级认证完全指南:考点解析与备考策略
  • SpringBoot3实战集成mzt-biz-log,一行代码搞定业务日志记录
  • 电网电压扰动下相光伏并网逆变器控制的Simulink仿真探索
  • 技术人思维看渠道品牌管理:如何让“多渠道不走样”成为可执行的工程化规则?
  • 基于Matlab的螺丝轮廓识别:数字图像处理流程
  • STM32串口双机模拟汽车电量里程项目:Protues仿真与源码解析
  • 无人零售/五金厂必看!边缘设备Java+YOLOv11推理稳定性全攻略:崩溃率从15%降到0.1%,断点续检1秒恢复
  • ThinkPHP反序列化漏洞深度解析:CacheStore组件为何成为攻击入口?
  • 探索Matlab在两相流动相场法与自适应网格中的应用
  • MATLAB代码:基于多能互补的热电联供型微网优化运行 关键词:多能互补 综合需求响应 热电联...
  • 微电网二次控制:下垂控制与基于数据采样二次控制的奇妙融合
  • 运用stata对CFPS数据库进行打开清洗和处理,以政府转移支付为例
  • 基于PDR算法的室内定位应用:运用行人轨迹推算算法实现连续定位,并优化轨迹采用卡尔曼滤波及无痕...
  • Screeps Arena 实战编程:从零构建你的RTS对战AI
  • 油藏数值模拟中的两相流动 IMPES 方法及 Matlab 实现
  • VSCODE离线环境也能玩转AI编程?手把手教你用CodeGPT插件本地跑大模型
  • 从实验室到开源社区:Scloud+后量子密码算法如何借力openHiTLS加速产业化
  • 提示词工程:这样跟AI说话,它才听你的!
  • 大模型(2):大模型推理文本分类
  • Passmark计算机系统测试工具全解析:从压力测试到性能评分
  • OAuth2.0中state参数的深度应用:业务数据的安全传输与防CSRF实践
  • 新年限定零食礼包推荐:生肖款与新品礼盒,哪一种更能代表节庆氛围? - Top品牌推荐官
  • 优化电动汽车充放电策略实现削峰填谷:一种面向多目标的Matlab调度算法
  • 如果 Canal 跑得比 MySQL 主从同步还快,脏数据怎么防?
  • CentOS7下DuckDB JDBC驱动兼容性构建实战:绕过GLIBC版本限制的三种方案
  • JavaDay07包机制及JavaDoc生成文档
  • Android 休眠机制详解 ——WakeLock、Doze 模式与待机功耗优化实战