0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CW32L012/F030灵眸X1智能小车--电机正反转控制

CW32生态社区 来源:CW32生态社区 2026-04-02 16:48 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、电机正转

电机驱动芯片RZ7899

RZ7899是一种高性能电机驱动芯片,广泛应用于各种电机控制场合,特别是在步进电机和直流电机的驱动中。以下是该芯片的一些关键特性和应用:

主要特性:

高驱动能力:RZ7899能够驱动高电流的电机,适合需要大功率输出的应用。

双通道设计:具备双通道输出,能够同时驱动两个电机,提升设计灵活性。

PWM控制:支持脉宽调制(PWM)控制,使得电机的运行更加平滑和高效。

过流保护:内置过流保护功能,确保芯片和电机在异常情况下的安全运行。

热保护功能:能够监测温度并在过热时自动停止工作,防止损坏。

低静态功耗:在静态模式下功耗较低,适合需要长时间待机的应用场合。

多种控制模式:支持多种控制模式,包括全桥、半桥等,满足不同电机控制需求。

该模块在开发板上位置如下:

图片

2.原理图

图片

在开发板上左右两个电机分别接到了两块RZ7899上,左电机使用CW32的PB3和PB4控制,右电机使用CW32的PB12和PB5控制。

3.查看资料

翻阅手册我们可以发现,其实驱动电机只需要输入端接到MCU的两个引脚,输出端分别接到电机的两个引脚,即可通过改变输入端电平实现正反转。

注意:输出端5脚和6脚,7脚和8脚为一组

图片

4.代码编写

根据上述从手册中查到的信息,我们知道了驱动方法之后就可以开始驱动代码的编写了。在工程中新建一个电机的.c和.h文件,名字自己确定,然后在.c中编写如下代码:

void Motor_Init(void)
{
        __RCC_GPIOB_CLK_ENABLE();//开启GPIOB时钟
        GPIO_InitTypeDef GPIO_InitStruct; 
        GPIO_InitStruct.IT=GPIO_IT_NONE;
        GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP;//配置为推挽输出
        GPIO_InitStruct.Pins=GPIO_PIN_3 | GPIO_PIN_4;//选择GPIO口
        GPIO_InitStruct.Speed=GPIO_SPEED_HIGH;
        GPIO_Init(CW_GPIOB, &GPIO_InitStruct);
}

随后在main函数中编写如下代码

int main(void)
{
        OLED_Init();//初始化
        Motor_Init();//初始化电机
        while(1)
        {
                PB03_SETHIGH();//PB3置高电平
                PB04_SETLOW();//PB4置低电平
        }
}

我们给PB3置为高电平,PB4置低电平,满足手册驱动真值表中驱动电机要求,即可实现正转。

5.运行现象

将本次项目代码烧录进开发板之后,可以观察到左电机开始正转。

wKgZO2nL0BSAPl4BAAAiJASTtM8571.jpg

二、电机正反转控制

根据上面的实验,我们已经完成了单个电机的正转,那么凭各位工程师的聪明才智应该很快就能想到如何控制两个电机同时正转以及反转了。复制上一次工程,我们稍加修改即可。

1.代码如下:

void Motor_Init(void)
{
        __RCC_GPIOB_CLK_ENABLE();//开启GPIOB时钟
        GPIO_InitTypeDef GPIO_InitStruct; 
        GPIO_InitStruct.IT=GPIO_IT_NONE;
        GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP;//配置为推挽输出
        GPIO_InitStruct.Pins=GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_12 | GPIO_PIN_5;//选择GPIO口
        GPIO_InitStruct.Speed=GPIO_SPEED_HIGH;
        GPIO_Init(CW_GPIOB, &GPIO_InitStruct);

        Right_Motor_stop();//
        Left_Motor_stop();//
}

将右边电机的控制GPIO也初始化,然后将电机运动稍微封装一下

void Left_Motor_foreward(void)
{
        PB03_SETHIGH();//PB3置高电平
        PB04_SETLOW();//PB4置低电平
}
void Left_Motor_reversal(void)
{
        PB04_SETHIGH();//PB4置高电平
        PB03_SETLOW();//PB3置低电平
}
void Left_Motor_stop(void)
{
        PB04_SETLOW();//PB4置低电平
        PB03_SETLOW();//PB3置低电平
}
void Right_Motor_foreward(void)
{
        PB05_SETLOW();//PB12置低电平
        PB12_SETHIGH();//PB5置高电平
}
void Right_Motor_reversal(void)
{
        PB12_SETLOW();//PB12置低电平
        PB05_SETHIGH();//PB5置高电平
}
void Right_Motor_stop(void)
{
        PB12_SETLOW();//PB12置低电平
        PB05_SETLOW();//PB5置低电平
}

这样就可以灵活地驱动电机正反转了,然后在主函数中加入以下代码

uint8_t keynum,Left_state,Right_state;
int main(void)
{
        OLED_Init();//初始化
        LED_Init();//LED初始化
        Key_Init();//按键初始化
        Motor_Init();//初始化电机
        while(1)
        {
                keynum=Key();//获取键码,
                if(keynum==1){Left_state++;Left_state%=4;}//按键1按下一次,变量+1,加到4归零
                if(keynum==2){Right_state++;Right_state%=4;}
                if(Left_state==0 || Left_state==2)//条件判断变量为1或者2停下
                {
                        Left_Motor_stop();//左电机停

                }
                else if(Left_state==1)
                {
                        Left_Motor_foreward();//左电机正转

                }
                else if(Left_state==3)
                {
                        Left_Motor_reversal();//左电机反转
                        PC13_SETHIGH();
                }
                if(Right_state==0 || Right_state==2)
                {
                        Right_Motor_stop();//右电机停
                }
                else if(Right_state==1)
                {
                        Right_Motor_foreward();//右电机正转
                }
                else if(Right_state==3)
                {
                        Right_Motor_reversal();//右电机正转
                }
                if((Right_state==0 || Right_state==2 ) && (Left_state==0 || Left_state==2 ))
                {
                        PC13_SETLOW();//LED点亮
                }
                else{
                        PC13_SETHIGH();                //LED熄灭        
                }
                OLED_ShowNum(1,1,Left_state,2);//屏幕显示变量
                OLED_ShowNum(2,1,Right_state,2);
        }
}

2.运行现象

将本次项目代码烧录进开发板之后,我们可以观察到以下现象:

上电之后电机停止

OLED屏幕第一行显示00,第二行也显示00,记录按键按下次数,到四归零

LED点亮

按下按键一,左电机正转,再按下停止,再按下反转,再按下停止

按下按键二,右电机正转,再按下停止,再按下反转,再按下停止

电机停止时LED点亮,反之则熄灭

7455588942e1d88d26d636dafd887ab2.jpg

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 智能小车
    +关注

    关注

    87

    文章

    565

    浏览量

    83516
  • 正反转控制
    +关注

    关注

    3

    文章

    34

    浏览量

    11406
  • CW32
    +关注

    关注

    1

    文章

    323

    浏览量

    1953
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    CW32L012/F030X1智能小车——板载WS2812驱动示例

    WS2812是一种广泛使用的地址可控制的RGB LED模块,其内置驱动电路和控制芯片,允许用户通过单线信号控制多个LED的颜色和亮度。
    的头像 发表于 01-05 16:35 3299次阅读
    <b class='flag-5'>CW32L012</b>/<b class='flag-5'>F030</b><b class='flag-5'>灵</b><b class='flag-5'>眸</b><b class='flag-5'>X1</b><b class='flag-5'>智能</b><b class='flag-5'>小车</b>——板载WS2812驱动示例

    CW32L012/F030X1智能小车——超声波模块配置

    SR04超声波模块是一款广泛应用的测距传感器,主要用于使用超声波测量物体与传感器之间的距离。它是一个成本低廉、精度较高且易于使用的传感器,常用于机器人、智能家居、无人机、汽车防撞系统等项目。
    的头像 发表于 01-05 16:54 3056次阅读
    <b class='flag-5'>CW32L012</b>/<b class='flag-5'>F030</b><b class='flag-5'>灵</b><b class='flag-5'>眸</b><b class='flag-5'>X1</b><b class='flag-5'>智能</b><b class='flag-5'>小车</b>——超声波模块配置

    CW32L012/F030X1智能小车——使用NRF24L01通信

    NRF24L01所使用的通讯协议为SPI,SPI又可分为软件SPI和硬件SPI。
    的头像 发表于 04-01 16:49 2523次阅读
    <b class='flag-5'>CW32L012</b>/<b class='flag-5'>F030</b><b class='flag-5'>灵</b><b class='flag-5'>眸</b><b class='flag-5'>X1</b><b class='flag-5'>智能</b><b class='flag-5'>小车</b>——使用NRF24<b class='flag-5'>L</b>01通信

    CW32L012/F030X1智能小车——使用蓝牙模块通讯

    主控板配套的是一款低功耗蓝牙模块,适用于短距离无线通信。该模块通常被用于各种嵌入式项目,如物联网(IoT)设备、手机配件、智能家居设备、医疗设备等。
    的头像 发表于 04-01 16:54 3264次阅读
    <b class='flag-5'>CW32L012</b>/<b class='flag-5'>F030</b><b class='flag-5'>灵</b><b class='flag-5'>眸</b><b class='flag-5'>X1</b><b class='flag-5'>智能</b><b class='flag-5'>小车</b>——使用蓝牙模块通讯

    坚持继续布局32位MCU,进一步完善产品阵容,96Mhz主频CW32L012新品发布!

    基于CW32L01x系列低功耗微控制器家族的全新成员:CW32L012系列产品。 CW32L012基于ARM® Cortex-M0+内核,主频高达96MHz,同时集成了CORDIC硬件
    发表于 07-16 16:32

    **CW32L012****开发评估板的第一个程序**

    CW32L012****开发评估板的第一个程序 最近以15.99在CW32生态社区入手了这块CW32L012开发评估板,我迫不及待的烧录进电灯程序,看看这块板子是否是正常的,能否满足我后面的学习
    发表于 11-22 00:09

    CW32L012小型机器人控制评估板活动 四足机器人+智能小车 开箱评测

    CW32L012活动相关资料链接:https://dwi41yhz703.feishu.cn/wiki/B1Ihw31ebiX0vkkhQr2cINnkn1g 小型机器人+智能小车
    发表于 11-24 23:44

    pwm控制电机正反转,PWM直流电机调速程序

    PWM调速开关控制方式控制电机,广泛应用于玩具、小车、机器人等项目,通过串口预设正反转速度,可以灵活控制
    发表于 10-30 15:00 2.1w次阅读

    电机正反转 如何确定电机正反转

    电机正反转是指电机顺时针转动和逆时针转动。电机顺时针转动是电机正转,电机逆时针转动是
    的头像 发表于 07-15 15:34 7.5w次阅读

    【STM32小案例01】用STM32F103ZET6使用L298N电机驱动模块 控制电机(电动推杆)正反转

    【STM32小案例01】用STM32简单使用L298N电机驱动模块 控制电机(电动推杆)正反转​ 本文将简单介绍如何通过
    发表于 12-24 19:39 65次下载
    【STM32小案例01】用STM32<b class='flag-5'>F</b>103ZET6使用<b class='flag-5'>L</b>298N<b class='flag-5'>电机</b>驱动模块 <b class='flag-5'>控制</b><b class='flag-5'>电机</b>(电动推杆)<b class='flag-5'>正反转</b>

    简单介绍plc如何控制电机正反转

    的方向,可以实现电机正反转。当电流方向与磁场方向一致时,电机顺时针旋转;当电流方向与磁场方向相反时,电机逆时针旋转。 二、PLC控制
    的头像 发表于 07-29 10:37 3061次阅读

    CW32L012小机器人的电机控制

    线的大功率调速,电机控制性能直接决定了系统的响应速度、运行精度、能耗效率与稳定性。这里分享CW32L012小机器人的正反转、调速的电机
    的头像 发表于 11-21 13:18 2530次阅读
    <b class='flag-5'>CW32L012</b>小机器人的<b class='flag-5'>电机</b><b class='flag-5'>控制</b>

    CW32L012与STM32F103的三角运算性能对比

    没有硬件浮点运算单元。 但在运算三角函数时,CW32L012支持CORDIC算法。 二、 三角运算性能具体分析 1:标准库浮点运算(如 math.h 的 sinf, cosf) 这是最常用但也是最慢的方式。 STM32F103C
    的头像 发表于 12-29 15:32 2484次阅读
    <b class='flag-5'>CW32L012</b>与STM32<b class='flag-5'>F</b>103的三角运算性能对比

    CW32L012与STM32G431的CORDIC三角函数运算性能对比

    CORDIC协处理器的三角运算性能对比。对比结果出乎意料。 一、硬件架构 二、运算100W次SIN30度与COS30度的代码实现 1.CW32L012 CW32L012的CORDIC提供某些数学函数
    的头像 发表于 12-29 15:55 2744次阅读
    <b class='flag-5'>CW32L012</b>与STM32G431的CORDIC三角函数运算性能对比

    CW32L012/F030X1智能小车--电机调速控制

    PWM(Pulse Width Modulation脉宽调制)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器
    的头像 发表于 04-02 16:49 1185次阅读
    <b class='flag-5'>CW32L012</b>/<b class='flag-5'>F030</b><b class='flag-5'>灵</b><b class='flag-5'>眸</b><b class='flag-5'>X1</b><b class='flag-5'>智能</b><b class='flag-5'>小车</b>--<b class='flag-5'>电机</b>调速<b class='flag-5'>控制</b>