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

CW32L012/F030灵眸X1智能小车--电机调速控制

1.认识PWMPWMPulse Width Modulation脉宽调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用方波占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号任然是数字的因为在给定的任何时刻满幅值的直流供电要么完全有要么完全无。比如我们的电压输出是5v的那么经过改变PWM的占空比可以达到在一定时间内输出3.3V或者1.3V的效果2.CW32 PWM介绍普通的IO控制虽然能让电机实现正反转但是电机只能在一个固定的速度下实现我们没法改变电机转动的速度那在实际使用中是非常不方便的所以本项目的目的为实现开发板上电机调速。想要实现电机调速其实非常简单根据前文芯片手册可知控制引脚置一个置高电平一个置低电平电机即可动起来两个都置低电平或高电平就会停止那我们只需要改变高电平持续时间不就可以实现调速了吗。想要改变高电平持续时间我们可以使用 CW32内部的硬件资源PWM。PWM功能是在定时器的基础上实现的但不是所有的定时器都支持PWM输出功能。从用户手册上可以了解到高级定时器拥有4个PWM通道通用定时器拥有4个PWM通道通用定时器拥有PWM通道。每一个PWM通道都对应单片机的一个管脚这个引脚不是唯一固定的可能有一个或者两个管脚都对应同一个通道我们在使用的时候可以任选其一进行配置。根据开发板原理图可知在开发板上左右两个电机分别接到了两块RZ7899上左电机为PB3和PB4右电机为PB1和PB5。再翻阅CW32数据手册可知PB4和PB5复用功能可以使用通用定时器输出比较的一通道和二通道我们配置一下即可。3.PWM基本参数PWM是脉冲宽度调制具有两个非常重要的参数频率和占空比。频率PWM的频率是整个周期的倒数。占空比占空比是指一个周期内高电平所占的比例。4.控制方法采样控制理论中有一个重要结论冲量相等而形状不同的窄脉冲加在具有惯性的环节上时其效果基本相同。PWM控制技术就是以该结论为理论基础对半导体开关器件的导通和关断进行控制使输出端得到一系列幅值相等而宽度不相等的脉冲用这些脉冲来代替正弦波或其他所需要的波形。按一定的规则对各脉冲的宽度进行调制即可改变逆变电路输出电压的大小也可改变输出频率。5.基本原理控制方式就是对逆变电路开关器件的通断进行控制使输出端得到一系列幅值相等但宽度不一致的脉冲用这些脉冲来代替正弦波或所需要的波形。也就是在输出波形的半个周期中产生多个脉冲使个脉冲的等值电压为正弦波形所获得的输出平滑且低次谐波少。按一定的规则对各脉冲的宽度进行调制即可改变逆变电路输出电压的大小也可改变输出频率。6.PWM优点PWM的一个优点是从处理器到被控制系统信号都是数字形式无需进行数模转换。让信号保持为数字形式可将噪声影响降到最小。噪声只有在强到足以将逻辑1改变为逻辑0或将逻辑0改变为逻辑1时才能对数字信号产生影响。对噪声抵抗能力的增强是PWM相对于模拟控制的另一个优点而且这也是在某些时候将PWM用于通信的主要原因。7.配置流程一般使用定时器PWM功能都需要有以下几个步骤。使能时钟配置GPIO配置定时器配置PWM使能TIMER调整定时器输出通道占空比8.配置GPIO前面介绍过PWM输出是依赖于定时器的所以要对定时器进行配置但是我们不使用定时器的中断功能顾不用对定时器的中断进行配置。又因为我们使用的PB4是GTIM1的通道1PB5是GTIM1的通道2所以我们要配置PB0的GPIO参数。首先是GPIO的参数结构体GPIO_InitTypeDef GPIO_InitStruct; // GPIO初始化结构体然后是GPIO配置参数GPIO_Initstructure.ITGPIO_IT_NONE; GPIO_Initstructure.ModeGPIO_MODE_OUTPUT_PP;//推挽输出 GPIO_Initstructure.PinsGPIO_PIN_4 | GPIO_PIN_5;//引脚配置 GPIO_Initstructure.SpeedGPIO_SPEED_HIGH; GPIO_Init(CW_GPIOB,GPIO_Initstructure);使用复用功能将PB5复用为GTIM1通道2的通道将PB4复用为GTIM1通道1的通道PB04_AFx_GTIM1CH1();//配置PB4复用功能为通用定时器一的一通道 PB05_AFx_GTIM1CH2();//配置PB5复用功能为通用定时器一的二通道9.配置定时器要使用定时器参数配置有一个结构体如图所示。参数说明uint32_t Mode: 这个字段用于指定GTIM的工作模式。GTIM_MODE_TIME基本定时器模式。GTIM_MODE_COUNTER计数器模式。GTIM_MODE_TRIGGER触发模式可能指定时器被用作触发源或响应于某个外部触发信号开始/停止计数。GTIM_MODE_GATE门控模式意味着定时器的计数操作受一个外部信号的控制即只有当这个控制信号有效时定时器才开始或继续计数。uint32_t OneShotMode: 此字段决定定时器是工作在单次计数模式还是一直循环计数连续计数模式。如果设置为单次模式定时器在达到重载值后会停止计数直到复位或重新配置如果是连续计数模式则会在达到重载值后自动重置并继续计数。FunctionalState ToggleOutState: 这个字段用于控制定时器的输出翻转功能是否使能。FunctionalState是一个类型定义通常有两个的值ENABLE和DISABLE分别表示启用或禁用定时器的输出引脚翻转功能。当定时器计数达到特定条件时其关联的输出引脚电平会翻转。uint32_t Prescaler: 预分频器的设置值。预分频器用于降低提供给定时器时钟的频率使得计数速度变慢从而实现更宽范围的计时能力。uint32_t ReloadValue: 重载值也称为自动装载寄存器值。当计数值达到此值时定时器会产生一个更新事件如中断或DMA请求并且计数器会根据OneShotMode的设置重置或继续计数。这个值决定了定时器溢出的周期是定时操作的核心配置之一。结构体定义GTIM_InitTypeDef GTIM_InitStruct; // 通用定时器初始化结构体相关配置如下GTIM_InitStruct.Mode GTIM_MODE_TIME; // 定时器模式 GTIM_InitStruct.OneShotMode GTIM_COUNT_CONTINUE; // 连续计数模式 GTIM_InitStruct.Prescaler GTIM_PRESCALER_DIV1024; // DCLK PCLK / 64 64MHz/64 1MHz GTIM_InitStruct.ReloadValue 1000; // 重装载值设置 GTIM_InitStruct.ToggleOutState DISABLE; // 输出翻转功能初始化配置GTIM_TimeBaseInit(CW_GTIM1, GTIM_InitStruct); // 初始化10.配置PWM配置好GTIMER1参数之后需要配置PWM输出。GTIM_OCInit(CW_GTIM1,GTIM_CHANNEL1,GTIM_OC_OUTPUT_PWM_HIGH);//输出比较通道初始化 GTIM_OCInit(CW_GTIM1,GTIM_CHANNEL2,GTIM_OC_OUTPUT_PWM_HIGH);11.使能TIMER我们使用函数TIM_Cmd初始化函数GTIM_Cmd(CW_GTIM1, ENABLE); // 使能定时器12.调整定时器输出通道占空比void GTIM_SetCompare1(GTIM_TypeDef *GTIMx, uint32_t Value)该函数GTIM_SetCompare3用于设置通用定时器GTIM的第3个通道Channel 3的比较值Compare ValueGTIMx: 指向通用定时器的类型定义指针。这是一个重要的参数用来指定要操作的具体定时器实例例如 TIM1、TIM2 等。使用前需要确保指针非空且指向有效的定时器。Value: 要设置的比较值类型为无符号32位整数。这个值决定了定时器计数器何时与之“比较”进而可能触发输出状态的改变比如在PWM模式下改变占空比函数没有返回值retval None。注意每个通道有不同的函数。通道2是GTIM_SetCompare2通道3是GTIM_SetCompare3如此以此类推。。。。在PWM脉冲宽度调制应用中可以通过改变CCR3的值来调整PWM信号的占空比。例如增加CCR3的值会增加PWM高电平的持续时间从而增加占空比。13.软件编写修改代码如下void Motor_Init(void) { RCC_AHBPeriphClk_Enable(RCC_AHB_PERIPH_GPIOB,ENABLE);//开启GPIOB时钟 RCC_APBPeriphClk_Enable1(RCC_APB1_PERIPH_GTIM1,ENABLE);//开启通用定时器一时钟 PB04_AFx_GTIM1CH1();//配置PB4复用功能为通用定时器一的一通道 PB05_AFx_GTIM1CH2();//配置PB5复用功能为通用定时器一的二通道 GPIO_InitTypeDef GPIO_Initstructure; GPIO_Initstructure.ITGPIO_IT_NONE; GPIO_Initstructure.ModeGPIO_MODE_OUTPUT_PP; GPIO_Initstructure.PinsGPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_3 | GPIO_PIN_1; GPIO_Initstructure.SpeedGPIO_SPEED_HIGH; GPIO_Init(CW_GPIOB,GPIO_Initstructure); GTIM_InitTypeDef GTIM_Initstructure; GTIM_Initstructure.ModeGTIM_MODE_TIME;//定时器模式 GTIM_Initstructure.OneShotModeGTIM_COUNT_CONTINUE;//连续计数 GTIM_Initstructure.PrescalerGTIM_PRESCALER_DIV1024;//配置预分频器 GTIM_Initstructure.ReloadValue1000;//自动重装载值 GTIM_Initstructure.ToggleOutStateDISABLE;//关闭输出反转 GTIM_TimeBaseInit(CW_GTIM1,GTIM_Initstructure); GTIM_OCInit(CW_GTIM1,GTIM_CHANNEL1,GTIM_OC_OUTPUT_PWM_HIGH);//输出比较通道初始化 GTIM_OCInit(CW_GTIM1,GTIM_CHANNEL2,GTIM_OC_OUTPUT_PWM_HIGH); CW_GTIM1-CCR10;//初始化ccr CW_GTIM1-CCR20; GTIM_ITConfig(CW_GTIM1,GTIM_IT_OV,ENABLE); GTIM_Cmd(CW_GTIM1,ENABLE); }配置输出通道/************************** 通道一输出配置 形参占空比最大1000 **************************/ void GTIM1_SetCompare1(uint16_t value)//通道一输出配置 { GTIM_SetCompare1(CW_GTIM1,value); } /************************** 通道二输出配置 形参占空比最大1000 **************************/ void GTIM1_SetCompare2(uint16_t value)//通道二输出配置 { GTIM_SetCompare2(CW_GTIM1,value); }电机正反转/************************** //左电机正转 形参占空比最大1000 **************************/ void Motor_Left_Run(uint16_t value)//左电机正转 { GTIM1_SetCompare1(value); PB03_SETHIGH(); } /************************** //右电机正转 形参占空比最大1000 **************************/ void Motor_Right_Retreat(uint16_t value)//右电机反转 { value1000-value; GTIM1_SetCompare2(value); PB12_SETLOW(); } /************************** 左电机反转 形参占空比最大1000 **************************/ void Motor_Left_Retreat(uint16_t value)//左电机反转 { value1000-value; GTIM1_SetCompare1(value); PB03_SETLOW(); } /************************** 右电机正转 形参占空比最大1000 **************************/ void Motor_Right_Run(uint16_t value)//右电机正转 { GTIM1_SetCompare2(value); PB12_SETHIGH(); } void Car_Run(uint16_t value)//小车前进 { Motor_Left_Run(value); Motor_Right_Run(value); } void Car_Left(uint16_t value)//左转 { Motor_Left_Retreat(value); Motor_Right_Run(value); } void Car_Right(uint16_t value)//右转 { Motor_Left_Run(value); Motor_Right_Retreat(value); } void Car_Retreat(uint16_t value)//后退 { Motor_Left_Retreat(value); Motor_Right_Retreat(value); } void Car_Stop(void)//停止 { Motor_Left_Run(0); Motor_Right_Run(0); }在主函数中编写以下代码int16_t keynum,speed; int main(void) { OLED_Init();//初始化 LED_Init();//LED初始化 Key_Init();//按键初始化 Motor_Init();//初始化电机 while(1) { keynumKey();//获取键码 if(keynum1){speed100;if(speed1000){speed1000;}} if(keynum2){speed-100;if(speed0){speed0;}} Motor_Left_Run(speed);//控制左电机 Motor_Right_Run(speed);//控制右电机 OLED_ShowString(1,1,speed); OLED_ShowNum(1,7,speed,4);//屏幕显示变量 } }14.实验现象将本次实验代码烧录进开发板之后我们可以观察到以下现象按下按键一电机速度将会以10%的速度递增按下按键二电机速度将会以10%的速度递减屏幕显示当前占空比

相关文章:

CW32L012/F030灵眸X1智能小车--电机调速控制

1.认识PWM PWM(Pulse Width Modulation脉宽调制)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波占空比被调制用来对一个具体模拟信号的电平…...

三菱PLC与MCGS组态农田智能灌溉系统:后发送产品梯形图原理图及IO分配与组态画面解析

基于三菱PLC和MCGS组态农田智能灌溉系统 我们主要的后发送的产品有,带解释的梯形图接线图原理图图纸,io分配,组态画面上周刚把农田智能灌溉的项目收尾,把资料打包发给客户的时候,终于能瘫在椅子上喝杯冰可乐了。这个…...

【C++第二十三章】C++11

前言 🚀C11 常被称为现代 C 的起点。它不是一次零碎的小修小补,而是一次真正改变编程方式的大版本更新:从统一初始化,到 auto / decltype 的类型推导;从右值引用、移动语义,到完美转发;再到 lam…...

Redis 全量主从同步和增量主从同步详解

Redis 主从同步:全量同步与增量同步详解 Redis 主从复制是实现高可用、读写分离和数据冗余的基础。复制过程分为全量同步和增量同步两种模式。理解它们的工作原理、触发条件及配置优化,是系统分析师设计高可用 Redis 架构的关键。 📌 一、主从复制基本概念 主节点(Master…...

从熬夜改稿到一键成稿:Paperxie AI 毕业论文写作,本科生的学术通关神器

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AIPPThttps://www.paperxie.cn/ai/dissertationhttps://www.paperxie.cn/ai/dissertation 一、写论文的痛,每个本科生都懂 凌晨三点的宿舍,电脑屏幕亮着刺眼的光,Word 文…...

2026年全场景适配最值得关注的五大能源管理系统

各位读者,大家好!在全球能源结构加速转型的当下,能源管理系统的发展至关重要。今天我要为大家介绍2026年全场景适配最值得关注的五大能源管理系统。这些系统对于企业提升能源管理的精细化、智能化水平,增强核心竞争力有着重要意义…...

MongoDB单节点转副本集(Docker安装版本)

为什么需要副本集?场景单节点副本集支持 Oplog❌✅MongoShake 同步❌✅数据备份恢复仅全量全量增量高可用❌✅核心结论:MongoShake 依赖 Oplog 实现实时同步,而 Oplog 只在副本集模式下产生。Docker Compose 配置version: 3.8 services:mongo…...

特定域名的proxy访问

不想破坏现有的proxy规则;某些域名需要proxy才可以上。 使用gost中的ss,简单搭建proxy:gost文档:https://v2.gost.run/ss/1. gost配置 服务端: gost -Lss://aes-128-gcm:password:8361客户端(windows&#…...

2026届毕业生推荐的五大AI论文网站实际效果

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 倚仗自然语言处理跟学术知识图谱技术的AI开题报告工具,能够快速生成研究背景、文…...

2025最权威的降重复率网站解析与推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 关于DeepSeek模型的学术论文,要着重于它的核心技术架构,这其中涵盖混…...

4 大类别 22 个高效的 Agentic Skills | 适用于 Claude、GPT

增强各类 AI 模型的能力,帮助你在写作、内容生产、研究分析、视觉表达、自动化执行等方面提升效率。 这些技能以 .md 格式编写,虽然这是 Claude 常用的技能格式,但你同样可以将内容复制到 ChatGPT 中使用。 Claude 如何创建 skill 国内用户…...

一篇吃透RNN(循环神经网络),LSTM(长短期记忆网络),BiLSTM(双向长短期记忆网络)算法,计算机小白也能轻松看懂

NLP-AHU-125(神秘暗号)哈喽各位CSDN的小伙伴们,我是一名专注AI入门干货的大学生博主~ 相信刚接触深度学习序列模型的同学,都被RNN、LSTM、BiLSTM这三个“孪生兄弟”绕晕过:明明都是处理序列数据&#xff0c…...

Golutra:超越 IDE , 一个人,一个 AI 军团!使用赛博监工系统,指挥你的 AI 牛马

⚡ 你有没有想过,如何能像管理微信群一样管理你的 AI 团队,让多 Agent 协同工作不再是幻想! | 以下观点都是个人使用,以及测评观点。 AI 工具革命的下一个阶段 如何能通过多路协同的方式调用不同的 AI 工具,然后又让…...

全域数学理论宇宙本源正式宣言(乖乖数学)

全域数学理论宇宙本源正式宣言 宣告日期:公元二〇二六年四月二日 宣告事由:庄严确立全域数学理论之宇宙本源核心定论,昭示宇宙根本运行法则,正式向世间宣告本理论之终极核心要义 序言 宇宙之本体、时空之本质、物质之根源&#xf…...

WarcraftHelper:魔兽争霸III终极优化指南 - 解决宽屏、帧率、地图限制三大痛点

WarcraftHelper:魔兽争霸III终极优化指南 - 解决宽屏、帧率、地图限制三大痛点 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 你是否还在…...

【教程4>第12章>第8节】基于FPGA的图像缩放实现——图像横向压缩仿真测试以及MATLAB辅助验证

本课程学习成果预览 目录 1.软件版本 2.图像横向压缩testbench编写 3.仿真测试 4.程序操作视频 欢迎订阅FPGA/MATLAB/Simulink系列教程 《★教程1:matlab入门100例》 《★教程2:fpga入门100例》 《★教程3:simulink入门60例》 《★教程4:FPGA/MATLAB/Simulink联合开发入门与…...

遗传算法VRP问题:VRP,多车容量约束 针对物流问题,根据实际情况,设置多车多容量,采用遗传...

遗传算法VRP问题:VRP,多车容量约束 针对物流问题,根据实际情况,设置多车多容量,采用遗传算法分析求解,在matlab实现并画图,展示求解结果前阵子帮做物流的表哥捋了捋他们的配送问题,本…...

根据所给文字范围,为您提供的总结标题为:“使用栅格法结合蚁群算法规划机器人全局路径

使用栅格法通过蚁群算法规划机器人全局路径上周帮实验室的学弟调他的机器人路径规划代码,他对着满屏的栅格地图挠头:明明地图里堵了个外卖柜,为啥机器人非要往那撞?后来聊到用蚁群算法做全局规划,才发现不少人把栅格法…...

Claude Code 之父:AI 的改变不止于代码,程序员需要改变整个工作流

高水平工程劳动,正在离开手写代码。编译 | 王启隆出品丨AI 科技大本营(ID:rgznai100)这两天,Claude Code 以一种多少有点尴尬的方式被更多人看见了。不是因为新模型发布,也不是因为哪场演示太惊艳&#xff…...

基于单片机的井盖监测系统

摘 要 当前我国设计的井盖监测主要通过在井盖上放置标识等放置被盗,然后监测到被盗后,通过摄像头对其进行跟踪,导致当前还是存在很多井盖被盗,因此此次设计一款主要针对井盖防盗系统,监测到井盖移动时发送信息到管理人…...

Java协议解析慢得离谱?5个被90%团队忽略的字节级优化陷阱,今天必须修复!

第一章:Java协议解析慢得离谱?5个被90%团队忽略的字节级优化陷阱,今天必须修复!Java应用在高频网络通信场景(如金融行情推送、IoT设备接入)中,常因协议解析层性能瓶颈导致端到端延迟飙升——问题…...

【预测模型】基于VMD-SE-GRU+Transformer多变量时序预测 Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。👇 关注我领取海量matlab电子书和数学建模资料🍊个人信条:格物致知,完整Matl…...

Android compose 可见性动画未执行问题修复

接着修改待办事项demo, 动画有问题, 导致初始不显示数据,其实数据库是有数据的。原代码如下:package com.example.testcompose1import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.Fa…...

3步高效获取电子课本:tchMaterial-parser让国家中小学智慧教育平台资源轻松到手

3步高效获取电子课本:tchMaterial-parser让国家中小学智慧教育平台资源轻松到手 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载,让您更方便地获…...

2026 AI简历工具排行榜:写出专业简历,助你直通面试

求职市场对人才的要求日益精细化,一份高质量的简历已成为开启职业大门的“敲门砖”。然而,对于许多求职者而言,“不会排版”、“不擅措辞”依然是制作简历时面临的两大难题。幸运的是,AI技术的飞速发展为我们带来了福音——AI简历…...

AI算力芯片黑马!“图灵进化”完成新一轮数千万级别融资

AI算力芯片赛道再添重磅玩家!近日,AI算力芯片创新企业图灵进化(TuringEvo)宣布完成新一轮数千万级别融资 ,本轮融资资金将主要用于核心产品量产、研发团队扩充及全球市场拓展。图灵进化定位于“覆盖云边端全场景AI算力…...

【Ease UI】2026-04-03组件更新:新增组件xly-china-map中国地图组件

🚀 即插即用的 Vue 3 业务组件库,让中后台开发回归简单Ease UI 是一套为「快速复制」而生的 Vue 3 业务组件库。每个组件都是独立的 .vue 单文件,不依赖任何外部样式或工具函数,直接复制到你的项目即可使用。它仅依赖 Element Plu…...

蓝桥杯备赛:Day3-P1102 A-B 数对

📚 算法笔记:P1102 A-B 数对 (枚举与哈希查找) 1. 题目简述 P1102 A-B 数对 - 洛谷 给出一个长度为 NNN 的正整数数列和一个整数 CCC,求有多少个不同的数对 (A,B)(A, B)(A,B) 满足 A−BCA - B CA−BC。 数据范围:N≤2105N \l…...

AI未来五年发展路径

AI的发展路径:生成能力-推理能力-Agent能力-数字虚拟人-具身机器人-脑机接口。(1)生成现在生成都已经渐入佳境:文本:文本报告生成、代码生成,如Claude Code语音:语音生成图片:图片生…...

【大模型智能体】【Harness Engineering】Natural-Language Agent Harnesses

摘要 智能体性能日益依赖于约束工程,然而约束设计通常深嵌于控制器代码与运行时特定规范中,难以作为科学对象进行转移、比较和研究。我们提出:智能体的高层控制逻辑能否被外化为一种可移植的可执行制品?我们引入了自然语言智能体约…...