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

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

3天内不再提示

【CW32L012小车测评】到手小车测评其中基本功能

吴帅 来源:jf_24214419 作者: 单片机 2025-11-24 22:59 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

开箱介绍

在CW小程序中购买了小车,其中的包装特别好,外面有个箱子来装着,其中我们将外包装拆开,可以看见我们本次购买的小车的本体,我购买的是焊接完成的,所以我可以开箱直接试用,方便很多,如果大家追求方便可以购买成品,如果想锻炼其中也有推荐的开发套件可以自行焊接。

其中到手的主要物品在这里:

wKgZPGklTqiAemV_AAK0sj4be8U142.png

其中还有电池和电池充电器,就没拍摄进来。

小车展示

wKgZPGklTrKAZjLUAAUnMtHAP3o929.png

小车正面图

其中小车底板。经过后面才发现其中前面小车的LED灯没有焊接,估计是人工焊接的时候忘记焊接LED灯,导致我以为其中是没有LED,导致后面循迹一直出现问题,后面补了3个灯实现补光操作。

小车资料

其中让我感觉社区搭建很不错,其中的资料都是在飞书中可以找到,我下载了其中的小车代码,然后在keil5中进行调试。

小车功能实现

红外和循迹控制小车

其中main函数的代码估计是调试代码放上来其中的注释有点多,后面简约通过ai修改了一下,将其中的功能大致分为几个部分。

char oled_disbuff[25];

uint8_t key;

uint16_t SpeedDelay = 150;

uint8_t car_state, last_car_state;

int16_t speed = 0, last_speed;

uint8_t change_speed_flag, speed_illegal_flag, change_car_state_flag, avoidance_flag, Gray_voice_flag;

float Hc04_val;

float power_val;

// 函数声明

static void handle_key_input(void);

static void update_car_state(void);

static void update_display(void);

static void initialize_hardware(void);

/**

* @brief 主函数

* @param None

* @retval int32_t

*/

int32_t main(void)

{

// 硬件初始化

initialize_hardware();

// 设置初始舵机角度

Set_car_Angle5(90);

// 初始化状态变量

last_car_state = car_state;

last_speed = speed;

// 主循环

while (1)

{

// 处理按键输入

handle_key_input();

// 传感器数据更新

Hc04_val = Get_Disance(); //获取超声波

power_val = get_power_val(); //计算电压

// 发送速度到语音模块

//send_spd_to_voice();

// 避障功能

//avoidance_fun();

check_Gray_and_changeState();

// 更新小车状态

update_car_state();

// 更新显示

update_display();

IR_fun();

}

}

/**

* @brief 硬件初始化函数

* @param None

* @retval None

*/

static void initialize_hardware(void)

{

SYSCTRL_Configuration();

LED_Init();

Buz_Init();

BTIM1_Init();

key_Init();

Uart_Init(); // UART1 PA9(T) 10

AC6328A_Init(); // UART2 PA2(T) 3

Servo_car_tail_Init(); // GTIM1 PB8

IR_Init();

OLED_Init();

HC_SR04_Init();

WS2812_Init();

Motor_Init(); // 与舵机共用GTIM1 PB3 4 5 12

ADC_track_Init(); // 舵机和ADC循迹采集口共用 循迹ADC PA1 4 5 6

}

/**

* @brief 处理按键输入

* @param None

* @retval None

*/

static void handle_key_input(void)

{

key = get_keyval();

switch (key)

{

case 1:

buz_flag = 1;

car_state = 0; // 停止状态

change_car_state_flag = 1;

break;

case 2:

buz_flag = 1;

car_state = 6; // 前进状态

speed = 200;

change_car_state_flag = 1;

break;

default:

break;

}

}

/**

* @brief 更新小车状态

* @param None

* @retval None

*/

static void update_car_state(void)

{

switch (car_state)

{

case 0: // 停止

Car_Stop();

WS_shadow(2);

Send_RGB(1, 0, 0, 0);

Send_RGB(3, 0, 0, 0);

break;

case 1: // 前进

if (gray_flag == 0)

Car_Run(speed);

check_Gray_and_changeState();

Send_RGB(2, 0, 255, 0);

Send_RGB(1, 0, 0, 0);

Send_RGB(3, 0, 0, 0);

break;

case 2: // 后退

Car_Run(-speed);

Send_RGB(2, 255, 0, 0);

Send_RGB(1, 0, 0, 0);

Send_RGB(3, 0, 0, 0);

break;

case 3: // 左转

Car_Left(speed);

Send_RGB(1, 255, 0, 0);

Send_RGB(2, 0, 0, 0);

Send_RGB(3, 0, 0, 0);

break;

case 4: // 右转

Car_Right(speed);

Send_RGB(3, 255, 0, 0);

Send_RGB(1, 0, 0, 0);

Send_RGB(2, 0, 0, 0);

break;

case 5: // 摇尾巴

wagtail();

Car_Stop();

WS_shadow(2);

Send_RGB(1, 0, 0, 0);

Send_RGB(3, 0, 0, 0);

break;

case 6: // 循迹

GrayscaleSensor_fun(); // 当前被注释

break;

default:

break;

}

}

/**

* @brief 更新OLED显示

* @param None

* @retval None

*/

static void update_display(void)

{

uint8_t D1, D2, D3;

// 显示超声波距离

if (Hc04_val == 0xffff || Hc04_val == 0)

OLED_Printf(1, 8, OLED_6X8, "HC04_Error ");

else

OLED_Printf(1, 8, OLED_6X8, "Distance:%.0fcm ", Hc04_val);

// 获取循迹传感器数据

get_track_data(&D1, &D2, &D3);

// 显示系统状态信息

OLED_Printf(1, 0, OLED_6X8, "Hello");

OLED_Printf(1, 16, OLED_6X8, "%d", car_state);

OLED_Printf(1, 24, OLED_6X8, "%d", avoidance_flag);

OLED_Printf(1, 32, OLED_6X8, "Sensor:%d %d %d", D1, D2, D3);

OLED_Printf(1, 40, OLED_6X8, "Power_Voltage:%.2f", power_val);

// 更新OLED显示

OLED_Update();

}

/**

* @brief 系统时钟配置

* @param None

* @retval None

*/

void SYSCTRL_Configuration(void)

{

/* 0. HSI使能并校准 */

SYSCTRL_HSI_Enable(SYSCTRL_HSIOSC_DIV1);

/* 1. 设置HCLK和PCLK的分频系数*/

SYSCTRL_HCLKPRS_Config(SYSCTRL_HCLK_DIV1);

SYSCTRL_PCLKPRS_Config(SYSCTRL_PCLK_DIV1);

SYSCTRL_SystemCoreClockUpdate(96000000);

}

/**

* @brief 检查小车状态变化

* @param None

* @retval None

*/

void check_car_state(void)

{

if (last_car_state != car_state)

{

last_car_state = car_state;

change_car_state_flag = 1;

}

if (last_speed != speed)

{

last_speed = speed;

change_speed_flag = 1;

}

}

简单的来说,其中小车上电就是超声波避障的功能,但拥有小车的我们谁不想控制小车,让小车循迹呢。其中大致框架已经帮我们写好了,我们只需要简单的调用就能实现操作,其中主函数启动红外功能,在while循环中接收指令码,就能实现小车的移动功能。

wKgZO2klTs2ANWciAC0UfDk7K58135.png

外红功能展示。

wKgZO2klTyGABm_UADMq2_fUZgo855.png

循迹功能展示,其中使用按键1开启和按键2关闭。

因为手头没有白灯,只有蓝灯导致其中红外循迹可能有点不准。

总结

其中小车的功能性和趣味性很足,其中还有更多的功能蓝牙控制,超声波循迹等待大家探索,我也是特别喜欢小车,拥有一台属于自己的小车是多少电子人的追求,也是简单上手也体验到小车运动的快乐,大家喜欢的话,可以在CW32社区中查询灵眸小车。

审核编辑 黄宇

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

    关注

    1

    文章

    326

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    CW32L012的FOC电机驱动的运放电路设计解析

    CW32L012由于有两个内置运放,所以在设计FOC电机驱动时,可以考虑使用内置运放做单/双电阻的电流采样。 以下图B相为例,运放及外围电路构成同相放大电路,由于相电流存在正负方向,所以需要增加偏置
    的头像 发表于 04-28 15:00 494次阅读
    <b class='flag-5'>CW32L012</b>的FOC电机驱动的运放电路设计解析

    CW32L012电压电流表设计思路

    CW32L012C8T6 定位为 电机控制、电源管理、智能仪表、工业传感器 等领域的高性价比解决方案,尤其适合需要 高精度模拟信号处理 + 复杂数字控制 的混合信号系统, ARM
    的头像 发表于 03-31 21:32 663次阅读

    FOC控制中如何利用芯片内部的运放设计电流采样电路?

    最近开发电机控制的项目,我开始使用最新的CW32L012做主控,CW32L012作为混合信号MCU,相比于传统MCU控制,集成度较高,性能当然也更好,加之又是48Pin的芯片,因此我开始做的关于CW32L012主控的电机驱动项目
    的头像 发表于 01-05 16:50 3006次阅读
    FOC控制中如何利用芯片内部的运放设计电流采样电路?

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

    本文对比均为作者实测,结果仅供参考,可附代码供有意者评估~ STM32G431是STM32家族中较新的产品。CW32L012也是武汉芯源半导体最新推出的混合信号MCU,让我们深入分析基于各自芯片
    的头像 发表于 12-29 15:55 2837次阅读
    <b class='flag-5'>CW32L012</b>与STM32G431的CORDIC三角函数运算性能对比

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

    ​  CW32L012和STM32F103在定位和性能上差异显著,在三角函数的运算性能上的对比亦非常直观。 一、 硬件架构对比(性能基础) 芯片型号 CW32L012C8 STM32F103C8
    的头像 发表于 12-29 15:32 2556次阅读
    <b class='flag-5'>CW32L012</b>与STM32F103的三角运算性能对比

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

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

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

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

    白嫖的CW32小车的蓝牙模式使用教程

    ,0X02,0X03,0X04,0X00,速度也是同样如此,我们把这个指令编辑到这个蓝牙编辑界面中,像这样: 每个按键都编辑好对应的指令,这样蓝牙上位机的配置也配置好了,按照这样的步骤,我很流畅的通过蓝牙遥控上了这款CW32L012小车,整个过程还是很顺利的。
    发表于 11-21 15:38

    CW32L012小机器人的电机控制

    线的大功率调速,电机的控制性能直接决定了系统的响应速度、运行精度、能耗效率与稳定性。这里分享CW32L012小机器人的正反转、调速的电机控制 电机的正反转 从配套的开发板资料介绍中可以知道,这是电机的驱动芯片RZ7899 从立创商城下载该芯片的数据
    的头像 发表于 11-21 13:18 2579次阅读
    <b class='flag-5'>CW32L012</b>小机器人的电机控制

    使用芯源CW32的CW32L012开发评估板做了spi屏幕驱动

    CW32生态社区以极高的性价比入手了这块CW32L012开发评估板,开发板以底板、核心板、1.77寸TFT显示屏构成,所有的IO口都引出了排针,这点好评,使用杜邦线可以非常方便的连接其他模块。引脚
    的头像 发表于 11-21 11:34 859次阅读
    使用芯源<b class='flag-5'>CW</b>32的<b class='flag-5'>CW32L012</b>开发评估板做了spi屏幕驱动

    CW32L01​⁠‬​​​⁠⁠⁠​⁠​​​​​⁠‍​‍‌‍​​​⁠​‬‌‬‌1的测评分享

    CW32L01⁠‬⁠⁠⁠⁠⁠‍‍‌‍⁠‬‌‬‌1电机驱动开发板 一 、开箱与硬件解析 1. 活动与资源 首先要感谢武汉芯源官方提供的这次宝贵的测评机会。如果你也对这块板子或者CW
    发表于 11-17 08:24

    CW32L012小车组装调试

    对应不同的速度,数字越大速度越快 * 按键用来摇尾巴 上下左右方向键 对应 前进 后退 左转 右转 语音控制 避障功能 车头超声波探头用来测距避障 蓝牙遥控
    发表于 11-17 00:12

    CW32L011口袋电源开箱测评

    CW32L011口袋电源开箱测评
    的头像 发表于 08-25 17:06 1153次阅读
    <b class='flag-5'>CW32L</b>011口袋电源开箱<b class='flag-5'>测评</b>

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

    CW32L012基于ARM® Cortex-M0+内核,主频高达96MHz,同时集成了CORDIC硬件单元、扩展算术运算单元(EAU),可以提供部分数学函数、算术运算的硬件加速,特别适用于电机控制、电源、计量、信号处理等应用。
    的头像 发表于 07-16 16:34 1578次阅读
    坚持继续布局32位MCU,进一步完善产品阵容,96Mhz主频<b class='flag-5'>CW32L012</b>新品发布!

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

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