【21ic DIY秀】基于MM32F031 的遥感智能小车
本帖最后由 hsxs 于 2019-4-8 21:30 编辑前些日子正好想做个小车玩一下,
正好公司有批新的国产单片机,
然后我就拿过来连连手学习一下。
1.主控用的是MM32F031
2.电源 准备使用锂电池,所以想着干脆上面堆一个充电模块好了,也便宜。
而且自己焊接还有好多分立器件麻烦
锂电池3.7V ,后面用了个升压模块升压到5V。
供电部分的电路全部都是用的模块,这两个模块加起来4块钱都不到。
3.电机 用到是淘宝买的 N20减速电机6V200转的,后面感觉速度还是慢了些,
配套的固定件,轴连器,螺丝等等
没有使用分立元件搭建驱动,直接用了电机驱动芯片TB6612..单买好贵,加运费一个都快4,5块了。
4.RGB 灯光效果用到是ws2812的RGB灯,这个便宜而且效果很好,不过对时序要求满厉害的,
最后用到方案是DMA+PWM,后面看起来效果还是很不错的。
5.蓝牙 之前看过有人专门写了个APP ,里面有摇杆控制,重力控制等等,还是挺好用的,
所以我买了蓝牙串口模块堆上去,方便快捷。
6.蜂鸣器,堆料堆了一个无源的贴片蜂鸣器,这个也便宜。
7.其他 搞了一个OLED屏和几个按键,准备做点交互按钮,还有超声波模块预留,
超声波这块程序还没开始写。不过看了原理和应用应该不难,
8.PID 巡线 失策了好像,之前没做过没用过这类元器件,用了个ITR8307贴片的,后来发现轮子太大了
反射距离好像有点高,,所以这块功能也还没开始写。
先放张PCB 图, 正好上次注册捷配账号,给送了20块钱优惠卷 ,只花了15块钱,
关键是顺丰包邮!!!
PCB 图 没想好放什么** 就放了个 vans 的
挺好看的。我觉得这个** ,
top
https://www.bilibili.com/video/av48727886?pop_share=1
本帖最后由 hsxs 于 2019-3-22 22:04 编辑
先来一张 材料全图
当时焊了贴片的元器件,很舒服
慢慢的装好零件
说真的,这轮子好贵。。15块钱一对。。。。
但是确实很舒服
本帖最后由 hsxs 于 2019-3-27 22:25 编辑
后面第一步先亮灯!
发现视频得挂链接。。视频网站得审核,,审核好了我再挂上链接
明天在挂上原理图+程序源码。今天先这样了。。
之后再写 其他功能的程序,。。目前就完成了 电机驱动 控制,还有rgb灯,但是把一些驱动都写好了
剩下的就是功能整合了
/********************************************************************************************************
**函数信息 :void TIM3_PWM_Init(u16 arr,u16 psc)
**功能描述 :TIM3 PWM初始化
**输入参数 :
**输出参数 :
********************************************************************************************************/
void TIM3_PWM_Init(u16 arr,u16 psc,u16 pluse)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
TIM_OCInitTypeDefTIM_OCInitStructure;
TIM_DeInit(TIM3);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //打开定时器3的时钟
//复用初始
GPIO_PinAFConfig(GPIOB,GPIO_PinSource4,GPIO_AF_1);
GPIO_InitStructure.GPIO_Pin = RGB_PIN; //TIM3_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = arr-1; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
/*****TIM_Period和TIM_Prescaler决定了周期*****=(480000)/(arr+1)*(psc+1)*/
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
TIM_ARRPreloadConfig(TIM3, ENABLE); //使能TIMx在ARR上的预装载寄存器
TIM_OCStructInit(&TIM_OCInitStructure); //装载默认值
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_Pulse = pluse; //设置待装入捕获比较寄存器的脉冲值
/*******TIM_Pulse决定了占空比******/
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性
TIM_OC1Init(TIM3, &TIM_OCInitStructure); //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //CH1预装载使能
TIM_DMACmd(TIM3, TIM_DMA_Update|TIM_DMA_Trigger, ENABLE);
TIM_DMACmd(TIM3, TIM_DMA_CC1, ENABLE);
// TIM_Cmd(TIM2, ENABLE); //使能TIMx
}
/********************************************************************************************************
**函数信息 :DMA_m8tom8_test(void)
**功能描述 : 把存储器中的某一地址开始的64个8位数据搬到存储器的另一个地址,并以8位方式存储
**输入参数 :无
**输出参数 :无
********************************************************************************************************/
#define TIM3_CCR1_Address 0x40000434
void DMA_TIM3_Init()
{
// NVIC_InitTypeDef NVIC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
DMA_DeInit(DMA1_Channel4); //通道2
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)TIM3_CCR1_Address; //目标地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)LED_BYTE_Buffer; //数据地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //传输方向MtoP
DMA_InitStructure.DMA_BufferSize = 10;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //TIM2_CCR2地址不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // automatically increase buffer index
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; //16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; // stop DMA feed after buffer size is reached
//不循环
DMA_InitStructure.DMA_Priority = DMA_Priority_High; //通道优先级 高
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //非存储器到存储器
// NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel2_3_IRQn;
// NVIC_InitStructure.NVIC_IRQChannelPriority = 2;
// NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
// NVIC_Init(&NVIC_InitStructure);
DMA_Init(DMA1_Channel4, &DMA_InitStructure);
// DMA_ITConfig(DMA1_Channel3, DMA_IT_TC, ENABLE);
}
串楼贴图
??????
hsxs 发表于 2019-3-22 22:05
后面第一步先亮灯!
发现视频得挂链接。。视频网站得审核,,审核好了我再挂上链接
加油,还有一周时间 springvirus 发表于 2019-3-23 12:01
加油,还有一周时间
哈哈哈哈好的 , 本帖最后由 hsxs 于 2019-3-23 12:44 编辑
美好的周末 爬起来 继续更新帖子
昨天上传视频,今天审核通过了,先挂上RGB的调试
写这个程序用了DMA+PWM的方式, 原因是这个RGB灯珠用的是WS2812的芯片,时序时间很短,
调试这个功能的时候,第一次使用DMA ,照着手册,再看例程,一步一步的调试,还是很用意思的。
并且学到了很多关于DMA的知识。
https://www.bilibili.com/video/av47031181
百度上有很详细的资料,,这个灯珠效果还是很好的。
这是小车的原理图
本帖最后由 hsxs 于 2019-3-23 14:35 编辑
花了一个晚上多的时间,调试了 APP上的摇杆控制功能,。
虽然可以PWM 调速,但是由于惯性的原因,刚开始小车容易急刹和急停
控制的原理其实就是XY 坐标的数据通过蓝牙串口传送数据,在进行帧的解析。
这个是加了优化后的控制效果
https://www.bilibili.com/video/av47033234
跑起来的那种感觉还是很顺畅的 看着很舒服
电机控制我用的是 TIM1定时器的PWM通道的 CH1N 和 CH3
因为当时画板子没考虑那么多,后来仔细看了一下手册上的引脚复用功能,还好是一个定时器的
要不然定时器要开好多个浪费资源。
我又上传了优酷的视频连接
https://v.youku.com/v_show/id_XNDEwNzk0MjE5Mg==.html?spm=a2hzp.8244740.0.0
https://v.youku.com/v_show/id_XNDEwNzk0MjE5Mg==.html?spm=a2hzp.8244740.0.0
本帖最后由 hsxs 于 2019-3-23 13:29 编辑
再贴个功能整合的
RGB 的协议
RGB:1 表示自动呼吸效果
RGB:0 表示手动模式,后面不加数据代表关闭灯光
RGB:0FFFFFF 表示手动模式,后面分别是红绿蓝三色的值
开机后蜂鸣器叫一声,蓝牙脸上后叫两声
https://www.bilibili.com/video/av47032462
本帖最后由 hsxs 于 2019-3-24 10:23 编辑
今天的小目标
想把超声波测距 功能调试好后,显示在OLED 上面
麻烦的点就在与怎么弄好看,。,,OLED
不知道界面有什么好的样式可以模仿一下。。。
超声波测距原理挺简单的,我用的是模块
发送脉冲后,打开定时器,检测高电平的时间,
然后计算
Vans是什么鬼 一叶倾城wwq 发表于 2019-3-23 14:11
Vans是什么鬼
哈哈哈哈,好看的** 找不到几个。就贴了个vans
怎么才能帖子里面直接贴视频啊,,我看这个点链接去视频网站看,有点麻烦 车做的不错啊.... 那个轮胎 在哪买的啊 链接还能告诉一下, 还有与N20电机 能配套的 万向轮 哪能买到啊... 这个PCB是 用 AD画的吗, 那个 N20 电机底座的 PCB 封装还能共享一下啊, 谢了.... zmg1688 发表于 2019-3-23 16:44
车做的不错啊.... 那个轮胎 在哪买的啊 链接还能告诉一下, 还有与N20电机 能配套的 万向轮 哪能买到啊. ...
轮胎 在那个平衡小车之家买的,, 本帖最后由 hsxs 于 2019-3-23 18:05 编辑
zmg1688 发表于 2019-3-23 16:49
这个PCB是 用 AD画的吗, 那个 N20 电机底座的 PCB 封装还能共享一下啊, 谢了.... ...
AD18 画的, 哪个封装我自己量的 可以呀我发你 hsxs 发表于 2019-3-23 14:31
哈哈哈哈,好看的** 找不到几个。就贴了个vans
你也是,自己画个专属的就好了嘛 一叶倾城wwq 发表于 2019-3-23 21:43
你也是,自己画个专属的就好了嘛
哈哈哈哈没有不会画画 hsxs 发表于 2019-3-23 21:47
哈哈哈哈没有不会画画
小车都弄出来了,还怕个**?对了,视频怎么上传,附个链接就好了吗?
页:
[1]
2