世纪电源网社区logo
社区
Datasheet
标题
返回顶部
原创 7th原创赛

Wifi Robot 的“第一次” 已完结

[复制链接]
查看: 16517 |回复: 423
1
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-2 08:53:50
     一路走过来,对嵌入式系统的兴趣越来越浓厚了,由于好奇心的增强,对于ARM内核也想去试试水,X86也跃跃欲试,有内核的驱动肯定需要上位机来应用,上位机这块以Google  Android和Apple IOS为主,一个资源混乱,一个资源严格审核,最明显的就是流畅度。还有就是Microsoft WP系统,曾经的手机王者Nokia搭载Windows Phone系统,由于种种原因销声匿迹,最后搭载Android系统,不管怎么说,我们向经典致敬(NOKIA)。这两大系统基于linux和Unix而开发,现在科技进步一天一个样,不管以后啥系统,原理都是通用的。对于wifi联网来说,IOT的兴起,类似的设备铺天而来,乐鑫的ESP8266模块,比较适合初级入门的开发,阿里云、华为云、机智云等云云泛起。对于WIFI机器人来说并不陌生,基于微小的linux系统Openwrt,下面是大概的框图,
小车.png
是不是可像一个无人机呢?手机APP(上位机)负责发送指令,通过上位机发送的指令给WIFI模块/路由器,经过TTL串口把指令传给MCU并解析协议,从而Wifi  Robot执行我们的指令,同时上位机向路由发送一个视频请求,路由端的视频处理程序会把获取的USB Camer视频传回上位机,上位机进行解码并显示。
    对于Wifi  Robot的初步尝试,没有电怎么工作呢,先从电源设计开始,,打算用三串或者单节的锂电池给整个设备供电,并且结合QC3.0技术实现快充,慢放,打算用IP5318的芯片,结合以高通骁龙CPU为主的美国高通公司新出的SMB1351实现锂电池充放电管理。

资料下载在帖子里都有,记得开始从51单片机学的,做的电子时钟,用的是STC12c5a60s2,当年的程序都分享了,慢慢的开始学ST的单片机,从STM8L到STM32,从标准库到HAl库,相关的例程和keil编译遇到的问题都在帖子里
,有关内核的底层驱动和linux应用学会后会慢慢分享(这次原创就是基于微小的linux系统OPENWRT),比如下面的。

1、ARM Cortex-M3权威指南(中文版)   这是对M3内核的了解

2、STM32F10xxx参考手册                  这个非常重要,相当于单片机的硬件手册,包括时钟、电源管理、寄存器等

3、STM32F101xx与STM32F103xx 固件函数库     这个使用库函数编程时的库函数手册

4、stm32参考手册      这个就是一些参考例程

5.  stm32芯片手册,就是对引脚功能的介绍等





评分

参与人数 121币 +10收起理由
世纪电源网-九天 + 10

查看全部评分

liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-2 08:55:14
 
这是5318的参数介绍
IP5318:I-Q3.0/2.0、I-P、TYPE-C快充IC电性参数如下:
(一)快充标准全支持
支持I-Qcharger3.0/2.0 快充输出标准
支持I-Pcharger快充标准
支持Type-C 快充标准
(二)全集成、低成本
单电感快速充电放电架构、集成功率MOS
集成I-Qcharger输出、I-Pcharger快充、Type-C、BC1.2等通讯协议
集成Type-C充电放电控制
(三)快充充电
5A快速充电,支持5V至12V高压快充输入,自动匹配适配器
支持I-Pcharger快充,3A@5V、2A@7V、2A@9V、1.5A@12V自动匹配;
支持Type-C  3A@5V、2A@9V、1.5A@12V快速充电
  (四)快充放电
快速放电: 3A@5V、2A@7V、2A@9V、1.5A@12V
Type-C快速放电: 3A@5V、2A@9V、1.5A@12V
Android 和apple 手机自动匹配
(五)高可靠性和灵活性
28V 输入、输出耐压,11重保护
集成14Bit ADC,集成Fuel Guage 电量计算法,支持I2C通讯
封装:QFN40

liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-2 09:04:59
 
这是1351的资料
SMB1351

是一款支持Quick Charge 2.0(QC 2.0)快速充电协议的充电接口控制器IC,可自动识别充 电设备类型.

SMB1351

并通过充电协议与设备握手,使之获得 设备允许的安全最高充电电压,在保护充电设备的前 提下节省充电时间。                           
特点
l         完全支持 Quick  Charge  2.0 规范
v                A类:5V、9V及12V输出电压
v                B类:5V、9V、12V及20V输出电压
v               可选12V或20V输出限制
l         兼容USB充电规范1.2
v               支持USB充电规范DCP模式
v               默认5V模式工作
l         待机功耗低
v                5 V输出电压时低于350uW
l         可靠的保护功能
v              引脚间短路保护
v              引脚开路保护及电路故障保护

liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-9-24 14:43:43
 
这是高通的快充芯片,现在苹果8出来个pd啥协议
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-25 08:22:09
 
QC快充采用高压的方式充电,到电池端变成大电流,损耗较大发热也厉害,PD协议现在最新的快充技术,不是太懂
YTDFWANGWEI
  • 积分:96773
  • |
  • 主题:138
  • |
  • 帖子:43212
积分:96773
版主
  • 2017-8-3 09:39:37
 
快充慢充可以理解,是为了给动力电池充电,那么这个放电功能是为了什么功能设计的呢?
liaozhaocheng
  • 积分:5519
  • |
  • 主题:50
  • |
  • 帖子:1293
积分:5519
版主
  • 2017-8-3 10:04:15
 
同问?
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-3 18:41:32
 
在这里主要就是快充功能,快放需要支持QC3.0协议才可以
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-3 18:37:38
 
其实这个快放功能对于小车不起作用,除非支持QC3.0协议,才能握手成功实现快放
世纪电源网-恬恬
  • 积分:5105
  • |
  • 主题:96
  • |
  • 帖子:375
积分:5105
超级版主
  • 2017-8-2 09:33:34
 
顶一个  期待后续更新
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-2 09:48:57
 
这是一次大胆的尝试,对我算是一种全新的挑战
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-2 11:15:52
 
这是参考设计原理图
1.png
liaozhaocheng
  • 积分:5519
  • |
  • 主题:50
  • |
  • 帖子:1293
积分:5519
版主
  • 2017-8-2 15:36:36
 
可以无线充电吗?
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-2 17:23:25
 
暂时没做这块,无线充电的话可以用ti的BQ系列的方案很成熟的
liaozhaocheng
  • 积分:5519
  • |
  • 主题:50
  • |
  • 帖子:1293
积分:5519
版主
  • 2017-8-3 10:05:16
 
那这个无线是遥控?
gxg1122
  • 积分:6006
  • |
  • 主题:39
  • |
  • 帖子:1123
积分:6006
LV8
副总工程师
  • 2017-8-3 13:23:57
 
应该是无线WIFI功能。
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-3 18:44:04
 
是的,您感觉那个平台好一点呢,机智云咋样
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-3 18:43:19
 
是APP控制的,打算用ESP8266这个模块
liaozhaocheng
  • 积分:5519
  • |
  • 主题:50
  • |
  • 帖子:1293
积分:5519
版主
  • 2017-8-3 19:28:47
 
后面能否有源程序呢?
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-4 12:11:58
 
这个是可以有的
liaozhaocheng
  • 积分:5519
  • |
  • 主题:50
  • |
  • 帖子:1293
积分:5519
版主
  • 2017-8-4 14:03:23
 
能公布源程序的我都顶
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-5 08:13:28
 
程序这块主要就是wifi和视频这块,第一次尝试,后期会整理
liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-8-13 20:38:48
 
这个无线充电感觉效率很低
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-15 08:14:15
 
无线充电效率不是太高,能达到80%以上就很不错了
huifeideyu
  • 积分:292
  • |
  • 主题:3
  • |
  • 帖子:76
积分:292
LV3
助理工程师
  • 2017-9-27 21:35:45
 
无线充电必须有线圈吧,怎么把电传过去
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-27 22:11:37
 
线圈是用来感应电的,就是线圈之间产生的磁场来传输电能的
huifeideyu
  • 积分:292
  • |
  • 主题:3
  • |
  • 帖子:76
积分:292
LV3
助理工程师
  • 2017-10-7 07:12:13
 
就是普通的变压器线圈吗?这种损耗太大了吧
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-10-7 10:30:13
 
具体损耗不知道多大,这是基本的原理
无线充电系统主要采用电磁感应原理,通过线圈进行能量耦合实现能量的传递。系统工作时输入端将交流市电经全桥整流电路变换成直 流电,或用24V直流电端直接为系统供电。经过电源管理模块后输出的直流电通过2M有源晶振逆变转换成高频交流电供给初级绕组。通过2个电感线圈耦合能 量,次级线圈输出的电流经接受转换电路变化成直流电为电池充电。
XIAOTU80
  • 积分:16070
  • |
  • 主题:349
  • |
  • 帖子:5245
积分:16070
版主
  • 2017-8-3 07:55:52
 
这个无线小车由哪几部份组成的?
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-3 09:22:21
 
MCU.png
这是初步的计划,您看看咋样
sfzhiye
  • 积分:288
  • |
  • 主题:5
  • |
  • 帖子:40
积分:288
LV3
助理工程师
  • 2017-8-3 09:06:15
 
关注起
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-3 09:24:08
 
板子.png
这是快充的板子
hellbaron2008
  • 积分:2954
  • |
  • 主题:20
  • |
  • 帖子:304
积分:2954
LV8
副总工程师
  • 2017-8-25 12:19:54
 
感觉这图画的好霸气啊,一眼看去板子上都是铜箔。
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-25 14:36:11
 
这么小的板子电流大,散热需要,铜箔多都开窗了
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-3 18:53:55
 
非常感谢
SkyCode
  • 积分:933
  • |
  • 主题:80
  • |
  • 帖子:208
积分:933
LV6
高级工程师
  • 2017-8-4 10:04:43
 
标记一下
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-4 14:11:10
 
您对无线小车有啥看法?共同探讨
liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-8-6 18:00:19
 
这是无线小车?

liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-8-6 18:01:53
 
看着是快充的移动电源
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-7 21:51:16
 
是啊,目前先介绍电源这块
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-7 21:49:58
 
对无线小车感兴趣不?可以探讨?
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-10 18:13:13
 
这是新的板子做了几套 111111112.jpg
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-10 18:14:29
 
手工焊接,明天做测试
11111111.jpg
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-11 09:10:15
 
大神们,有没有通过WIFi模块实现视频回传呢
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-11 09:54:50
 
2222.png
现在正在确定wifi小车的初步方案,网上通过视频传输的都是用无线路由器实现的,用wifi模块不知道可行。是数据传输速度不行吗,
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-11 17:53:04
 
11.jpg 12.jpg
这是上电测试的结果,这个实现快充的话电流大概4A,可以用MCU通过IIC控制电流的大小和电量的检测
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-11 17:56:26
 
用福禄克的钳形表测得结果,比较准确,其实快充的根本还是提高电池的充电电流,只不过在输入端提高电压的方式来降低电路的损耗,
liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-8-13 20:21:01
 
这个充电电流不小啊,
liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-8-13 20:25:17
 
普通的锂离子电池充电电流小,应该不行
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-15 08:22:01
 
大电流充电需要动力电池
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-15 08:20:32
 
快充的电流本来就不小,有的电流都达到6到10A
liushiming82
  • 积分:1513
  • |
  • 主题:5
  • |
  • 帖子:151
积分:1513
LV6
高级工程师
  • 2017-8-18 09:15:39
 
楼主,你用的锂电池没有保护板吗?保护也不可能提供这么大的电流呀
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-18 09:44:03
 
板子.jpg
这是板子的背面,应该明白了吧,保护板在背面做的,实际上电流也不算大,您可以算一下,这是5节电池并联10000ma,如果0.5C充电的话电流是5A,现在是0.4C充电
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-21 11:50:21
 
您感觉这个电流咋样,我也是第一次尝试
wangbin363
  • 积分:619
  • |
  • 主题:0
  • |
  • 帖子:34
积分:619
LV6
高级工程师
  • 2017-8-13 22:16:01
 
加油,楼主
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-13 22:40:29
 
谢谢,现在确定底盘怎么弄,选用啥电机较好
newcenturydesign
  • 积分:1813
  • |
  • 主题:18
  • |
  • 帖子:667
积分:1813
LV6
高级工程师
  • 2017-8-16 15:24:20
 
ANDROID APP开始写了没有?你是准备远程还是局域网?
串口WIFI模块做视频传输怕是不行的,最小要30帧/S才算能用的,在手机端H264解码就能刷到VIEW上显示了
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-16 15:42:19
 
最好是可以远程,30帧可以了,分辨率不高,能达到720P不错了,串口wifi模块内存大的应该可以吧
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-16 15:46:09
 
APP这块不会写啊,java开发吧,现在正在学习,
newcenturydesign
  • 积分:1813
  • |
  • 主题:18
  • |
  • 帖子:667
积分:1813
LV6
高级工程师
  • 2017-8-16 16:10:20
 
我是用JAVA开发的,不过现在出了新的语言,远程视频不好整的!
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-16 16:16:03
 
比如云台控制上下左右,这个指令是在APP中写的?
newcenturydesign
  • 积分:1813
  • |
  • 主题:18
  • |
  • 帖子:667
积分:1813
LV6
高级工程师
  • 2017-8-16 16:21:22
 
app透过服务器向单片机发指令,如果是局域网的话可以直接用手机和工作在AP状态下的WIFI模块建立UDP通信,然后向MCU发指令

liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-16 17:42:51
 
就是这个指令的协议是谁定的啊,不如帧头 帧尾 数据
liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-8-16 21:01:12
 
app界面倒也不是太难,云台控制,开启视频,小车的前后左右,但是自己开发没基础就难了

liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-17 14:40:36
 
看看在网上能不能找个开源的平台,做个简单的
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-22 21:29:23
 
做个WIFI  小车机器人,准备在网上买配件
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-22 21:33:22
 
电池的充放电电路自备,底盘    四个减速电机   **    舵机   主控板    电机驱动板    超声波测距模块    wifi数传模块
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-25 14:27:58
 
争取下周把这些配件买来
liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-8-26 14:48:49
 
整套小车配件买下来也得几百块啊
hellbaron2008
  • 积分:2954
  • |
  • 主题:20
  • |
  • 帖子:304
积分:2954
LV8
副总工程师
  • 2017-8-26 15:25:33
 
坐等小车。
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-28 12:46:32
 
感谢您的支持,这几天会不断的更新
liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-10-7 11:39:26
 
这个协议是自由通信协议,先定义好,双方根据协议去解析就是了
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-29 09:04:04
 
你好,局域网的APP和远程联网的APP有啥不同?
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-29 10:50:14
 
小车底座和电机,整套回来了,四个减速电机,
小车1.jpg
hellbaron2008
  • 积分:2954
  • |
  • 主题:20
  • |
  • 帖子:304
积分:2954
LV8
副总工程师
  • 2017-8-29 12:18:21
 
看着很帅的样子啊,期待组装好的小车。
newcenturydesign
  • 积分:1813
  • |
  • 主题:18
  • |
  • 帖子:667
积分:1813
LV6
高级工程师
  • 2017-8-29 17:23:44
 
先做出来个不用APP让他自己平衡的车出来,**的功能可以后面加上的
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-30 09:08:33
 
平衡小车需要配件啊,硬件部分包括车模设计、电机以及驱动、传感器(加速度传感器、陀螺仪等)、以及MCU核心处理模块;软件部分主要是对传感器数据的处理算法和电机驱动方法,
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-30 09:27:47
 
主要就是通过姿态传感器(常用的MPU6050)输出数字信号给MCU,控制电机的正反转和速度来保持平衡,涉及到一些算法,比如PID等,后续有时间大家可以共同学习
hellbaron2008
  • 积分:2954
  • |
  • 主题:20
  • |
  • 帖子:304
积分:2954
LV8
副总工程师
  • 2017-8-30 12:13:25
 
姿态传感器,第一次听说啊。
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-30 13:09:23
 
MPU6050六轴加速度陀螺仪模块角度传感器自平衡车四轴姿态传感器
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-30 08:53:42
 
我也期待小车是个啥样子,主要是程序这块需要琢磨琢磨
liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-8-31 06:31:22
 
更期待楼主把整个程序解说一下
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-31 21:14:09
 
刚装好的底盘
车1.jpg
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-8-31 21:15:07
 
还有下面的四个减速电机
车2.jpg
huifeideyu
  • 积分:292
  • |
  • 主题:3
  • |
  • 帖子:76
积分:292
LV3
助理工程师
  • 2017-9-2 14:30:17
 
小车不错、怎么控制的啊
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-2 22:04:58
 
您可以看一下上面的详细介绍
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-2 22:34:22
 
不好意思,今天一不小心发现77楼当时的组装错误,有一个电机的接线朝外了,四个电机的接线都朝内,并且左侧两个电机一组,右侧两个电机一组,一定要注意接线,具体怎么左右转动后续程序中介绍 车3.jpg



liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-2 22:39:09
 
舵机也回来了,买的二手的,可以手动转一下看看是否有卡死的情况,不行就调整一下舵机的白色轴, 车8.jpg 车6.jpg



liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-2 22:42:23
 
超声波模块没有买,以前学习51单片机时用的,避障的话不太精确
车9.jpg 车7.jpg
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-2 22:44:47
 
剩下就是三大模块之一wifi视频数传模块,
车5.jpg
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-2 22:46:10
 
三大模块之二电机驱动模块 车4.jpg



liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-2 22:48:55
 
控制模块打算用stm32F103系列的单片机负责接收指令并控制电机,下面需要对wifi模块刷openwrt系统
liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-9-2 23:49:25
 
楼主用超声波通过测距来避障吗
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-4 19:15:37
 
目前用超声波来测距,就是通过确定和障碍物的距离,比如探头感应到距离10cm,小车就停止
huifeideyu
  • 积分:292
  • |
  • 主题:3
  • |
  • 帖子:76
积分:292
LV3
助理工程师
  • 2017-9-3 07:40:39
 
我也是个新手,现在智能家具这块非常火,想学习一下
liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-9-3 17:03:07
 
是不是还少个**啊
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-4 20:24:09
 
其实智能家居这块源于物联网的兴起,主要有五种通信方式:Zigbee,Z-wave,433,315,wifi,蓝牙,比较常用的wifi和蓝牙较多,蓝牙的低功耗和wifi的远程监控特点在好多消费类电子设备运用很多,比如蓝牙音响,wifi插座,wifi**等等
huifeideyu
  • 积分:292
  • |
  • 主题:3
  • |
  • 帖子:76
积分:292
LV3
助理工程师
  • 2017-9-5 21:09:57
 
新手学习一下物联网,
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-9 08:31:57
 
网上有很多类似esp8266的模块可以参考学习
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-5 09:57:16
 

比较入门的就是esp8266wifi模块

1.png



liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-5 10:02:23
 
    简单介绍一下ESP8266模块,三种工作模式:Station 模式,AP 模式和AP 兼 Station 模式;有玩过路由器的应该知道路由器除了正常使用(AP模式)外,还可以接收其他路由器的信号(Station 模式),然后再发出来(AP 兼 Station 模式),都可以通过usb转ttl工具把8266脑连接,通过串口助手发送AT指令,但是要注意引脚的高低电平,还有串口助手选择好波特率  发送新行打钩,这是基本的配置http://www.cnblogs.com/yangfengwu/p/5205570.html,要通过wifi远程控制的话,需要与服务器连接,比如现在都是云服务器,机智云等,需要刷相应的固件SDK,工具比较多NodeMcu,网上教程和资料挺多的,可以学习一下

huifeideyu
  • 积分:292
  • |
  • 主题:3
  • |
  • 帖子:76
积分:292
LV3
助理工程师
  • 2017-9-8 23:02:03
 
有时间买个模块玩玩
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-9 08:41:53
 
就以机智云平台来说,http://www.gizwits.com/。上面有相关的教程,比如添加硬件设备,固件SDK,APP的开发都是开源的,可以参考
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-9 12:56:46
 
这是ESP8266wifi模块的相关资料链接:http://pan.baidu.com/s/1kVefmjd 密码:yn7f
lclbf
  • lclbf
  • 离线
  • LV8
  • 副总工程师
  • 积分:3988
  • |
  • 主题:26
  • |
  • 帖子:603
积分:3988
LV8
副总工程师
  • 2017-10-9 20:55:36
 
这个链接失效了!
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-10-9 22:13:27
 
不好意思啊,再用百度网盘分享一次链接:http://pan.baidu.com/s/1bp8Ps4J 密码:vc1q
这个可以的
liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-9-5 20:24:11
 
那么小啊,wifi模块就是功耗较大
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-5 21:25:23
 
也有低功耗的吧,蓝牙的功耗相对很低啊
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-5 21:44:36
 
先介绍一下OpenWrt系统
openwrt是嵌入式设备上运行的linux系统。
OpenWrt 的文件系统是可写的,开发者无需在每一次修改后重新编译,
令它更像一个小型的 Linux 电脑系统,也加快了开发速度。
你会发现无论是 ARM, PowerPC 或 MIPS 的处理器,都有很好的支持。
并且附带3000左右的软件包,用户可以方便的自定义功能来制作固件。
也可以方便的移植各类功能到openwrt下。


liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-5 22:28:50
 
wifi数传模块是基于MIPS 24K 高通CPU的一款WIFI1X1芯片AR9331,其SDK采用uboot作为引导。是基于MIPS 架构的,目前有x86、ARM和MIPS三种主流芯片架构,
ARM指令集架构的主要特点:一是体积小、低功耗、低成本、高性能;二是大量使用寄存器且大多数数据操作都在寄存器中完成,指令执行速度更快;三是寻址方式灵活简单,执行效率高;四是指令长度固定,可通过多流水线方式提高处理效率。


liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-5 22:30:43
 
共同学习一下这三种架构的不同 

MIPS是高效精简指令集计算机体系结构中的一种,与当前商业化最成功的ARM架构相比,MIPS的优势主要有五点:一是早于ARM支持64bit指令和操作,截至目前MIPS已面向高中低端市场先后发布了P5600系列、I6400系列和M5100系列64位处理器架构,其中P5600、I6400单核性能分别达到3.5和3.0DMIPS/MHz,即单核每秒可处理350万条和300万条指令,超过ARM Cortex-A53 230万条/秒的处理速度;二是MIPS有专门的除法器,可以执行除法指令;三是MIPS的内核寄存器比ARM多一倍,在同样的性能下MIPS的功耗会比ARM更低,同样功耗下性能比ARM更高;四是MIPS指令比ARM稍微多一些,执行部分运算更为灵活;五是MIPS在架构授权方面更为开放,允许授权商自行更改设计,如更多核的设计。



x86 CISC是一种为了便于编程和提高记忆体访问效率的芯片设计体系,包括两大主要特点:一是使用微代码,指令集可以直接在微代码记忆体里执行,新设计的处理器,只需增加较少的电晶体就可以执行同样的指令集,也可以很快地编写新的指令集程式;二是拥有庞大的指令集,x86拥有包括双运算元格式、寄存器到寄存器、寄存器到记忆体以及记忆体到寄存器的多种指令类型,为实现复杂操作,微处理器除向程序员提供类似各种寄存器和机器指令功能外,还通过存于只读存储器(ROM)中的微程序来实现极强的功能,微处理器在分析完每一条指令之后执行一系列初级指令运算来完成所需的功能。



liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-9-6 22:43:52
 
三大内核体系了解了,程序这块啥时候开始啊
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-7 08:17:24
 
固件刷完后更新有关stm32F103方面的程序和资料
liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-10-6 07:50:31
 
要是做产品的话,电池供电的肯定需要低功耗的mcu
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-10-7 11:08:16
 
在stm32当中L系列做的功耗非常低比如L476,都是STM官网推出的Nucleo系列开发板,而且板载下载调试器啊非常方便 1.jpg

学习的话用这款挺不错的

还有一款32引脚的L031,
1.jpg
liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-10-8 15:22:04
 
楼主这开发板买的吗,看着不错,送一套玩玩吧
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-10-9 10:43:51
 
淘宝上一大推,啥开发板都有
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-10-7 11:17:58
 
我们平时用的M3内核的较多,不过那个L476是M4内核的,上面都是些低功耗的而F4系列。比如入门级的F401,功能强大的,主频高的F413作为目前F4系列当中片上SRAM容量最高

1.jpg
作为我们平时学习用只做参考,还有好多开发板都可以,比如原子和野火的
FHXWT
  • FHXWT
  • 在线
  • LV8
  • 副总工程师
  • 积分:4208
  • |
  • 主题:1
  • |
  • 帖子:625
积分:4208
LV8
副总工程师
  • 2017-9-26 07:54:25
 
确实很牛啊    组装完成了没有啊   无线小车适用很广泛啊  希望楼主继续分享 好好 学习一下。
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-26 08:32:26
 
初步功能已经完成,您可以看一下录的一段视频咋样,您看有没有其他功能不错,可以尝试加上去
huifeideyu
  • 积分:292
  • |
  • 主题:3
  • |
  • 帖子:76
积分:292
LV3
助理工程师
  • 2017-9-27 21:40:32
 
您是做app ,有个eclipe啥软件是编程app 吗
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-27 21:59:44
 
Eclipse是著名的跨平台的自由集成开发环境(IDE),和我们平时用的keil一样的,是用JAVA语言开发的
huifeideyu
  • 积分:292
  • |
  • 主题:3
  • |
  • 帖子:76
积分:292
LV3
助理工程师
  • 2017-10-7 07:25:24
 
你好,视频传输这块每秒20帧可以吗我刚学习上位机软件这块,需要对拍照进行云点测试?不是太懂,小白求教
boyu23
  • boyu23
  • 离线
  • LV6
  • 高级工程师
  • 积分:406
  • |
  • 主题:0
  • |
  • 帖子:22
积分:406
LV6
高级工程师
  • 2017-9-7 14:19:02
 
大神  膜拜一下
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-7 15:07:33
 
大神不敢当啊呵呵,我们共同学习mcu控制这块
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-7 16:12:59
 
简单介绍一下wifi数传模块怎么刷机,首先通过USB口给设备供电,通过miniUSB口加上usb转网口网线连接电脑准备刷机工具

TFTP服务端:tftp32  就是局域网内可以传文件,

超级终端:putty  Telnet、SSH、rlogin、纯TCP以及串行接口连接软件
需要相应的固件
具体教程http://www.wifi-robots.com/thread-108-1-1.html

liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-7 16:30:20
 
下面的更新主要针对stm32方面的资料,小车的程序正在完善,会针对每个模块的相关资料和程序讲解一下
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-7 16:58:09
 
    首先我们先了解一下单片机,一颗单片机由中央处理单元(CPU)、程序存储器(ROM)、数据存储器(RAM)、外设等单元组成,我们经常说的内核,就是指的CPU内核,比如传统的51内核 、ARM、X86、x64等   51单片机运用的非常多,上学时用的89C51,主要是对寄存器进行操作,还有经常用的PIC,AVR,不过现在STC的增强型单片机也非常不错,功耗也比较低,但是和目前流行的ARM内核的STM32还有一定的差距,主要区别如下:   1,STM32的工作频率可以倍频到72M,而C51单片机的频率一般不宜超过24M   2,STM32单片机的RAM和ROM及FLASH存储空间比C51单片机的要大几十倍   3,相比于51单片机,STM32F103系列提供的外设也更加丰富,如CAN接口、USB接口等。  特别是在一些数据处理和操作系统上面32更占优势


hellbaron2008
  • 积分:2954
  • |
  • 主题:20
  • |
  • 帖子:304
积分:2954
LV8
副总工程师
  • 2017-9-7 20:26:22
 
对单片机的认识很到位啊,“不明觉厉”我是个外行。
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-7 21:14:21
 
我刚开始也是从51开始的,慢慢都熟悉了,共同学习
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-7 21:28:52
 
    对于STM32,我刚开始接触的是STM8,是个8位的单片机,具有3级流水线的哈佛结构,当时用的是STM8L。超低功耗的,支持ST-link在线调试
意法半导体的超低功耗产品线支持多种对功耗极为敏感的应用,例如便携式设备。STM8L基于8位STM8内核,与STM32L系列一样采用了专有超低漏电流工艺,利用最低功耗模式实现了超低功耗(0.30 uA)。
STM8L系列包括4个不同的产品线,适于需要特别注意节约功耗的应用。功能定时器,AD,中断,通信等
  • STM8L101系列
    • 最低功耗模式:0.30 uA
    • 动态运行模式:150 uA/MHz
  • STM8L151/152系列
    • 最低功耗模式:0.35 uA
    • 动态运行模式:180 uA/MHz
  • STM8L162系列
    • 最低功耗模式:0.35 uA
    • 动态运行模式:180 uA/MHz
  • STM8L051/052系列
    • 最低功耗模式:0.35 uA
    • 动态运行模式:180 uA/MHz

liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-7 21:36:31
 
本来是上传资料的,但是文件大 1.png
谁需要相关的资料可以留下邮箱
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-8 21:46:20
 
我们这个小车用到的单片机为STM32F103RBT6,这是基本的资料
1.png
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-8 21:58:38
 
这是芯片的官网链接http://www.stmcu.com.cn/Product/ ... f1/pn/STM32F103RBT6可以参考一下对于STM32系列的芯片编程时用寄存器和库函数都可以,51的IO的输出输入不需要配置寄存器,stm32的IO使用前得配置相应的寄存器,并且stm32的IO口都可以通过配置触发外部中断,在使用过程当中对IO口的操作最频繁,先说GPIO库
(1)       使用RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE)函数使能GPIO的AHB总线时钟。
(2)       使用GPIO_Init()函数对每个引脚进行四种可能的配置
           《1》       输入状态:Floating(浮空), Pull-up(上拉), Pull-down(下拉)
           《2》       输出状态:Push-Pull (上拉下拉)(Pull-up(上拉), Pull-down(下拉) or no Pull(不上拉也不下拉)),Open Drain(开漏) (Pull-up(上                  拉), Pull-down(下拉) or no Pull(不上拉也不下拉)),在输出模式,速度配置成2MHZ,25MHZ,50MHZ和100MHZ.
           《3》       第二功能:上拉下拉和开漏
           《4》       模拟:当一个管脚被用作ADC通道或者DAC输出的时候,需要配置成此模式
(3)       外设的第二功能:
           《1》       在ADC和DAC模式,使用GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AN把需要的管脚配置成模拟模式
           《2》       对于其它的管脚(定时器,串口等):
            使用GPIO_PinAFConfig()函数把管脚和需要的第二功能进行连接
            使用GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AF把需要的管脚配置成第二功能模式
             通过成员变量GPIO_PuPd, GPIO_OType and GPIO_Speed选择类型,上拉下拉和输出速度
              调用函数GPIO_Init()
(4)       在输入模式,使用函数GPIO_ReadInputDataBit()得到配置好管脚的电平
(5)       在输出模式,使用函数GPIO_SetBits()/GPIO_ResetBits()设置配置好IO的高低电平
(6)       在复位过程和刚刚复位后,第二功能是无效的,GPIO被配置成了输入浮空模式(JTAG管脚除外)
(7)       当LSE振荡器关闭的时候,LSE振荡器管脚OSC32_IN和OSC32_OUT可以作为通过IO来使用(分别用PC14和PC15表示)。LSE的优先级高于GPIO函数
(8)       当HSE振荡器关闭的时候,HSE振荡器管脚OSC_IN和OSC_OUT可以作为通用IO(PH0,PH1)来使用。HSE的优先级高于GPIO函数。







liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-8 22:16:55
 
这都是介绍的标准库,其实库函数就是把寄存器用结构体封装了吧,由于stm32的寄存器不像51那么简单,非常多的寄存器,要是一一配置很麻烦,用库函数很方便,但是要对相关的寄存器有所了解,
  具体函数说明
初始化和配置相关函数
1.  void GPIO_DeInit(GPIO_TypeDef* GPIOx)
函数解释gpio的反初始化函数,该函数的作用是把GPIO相关的寄存器配置成上电复位后的默认状态,在第一次初始化前或者不再使用某一个接口后可以调用该函数。
函数参数说明:GPIOxgpio的分组,如GPIOA  GPIOB  GPIOC等的宏定义(这些宏定义在头文件stm32f4xx.h中,由厂家写好,我们直接使用即可)

2.  void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef*GPIO_InitStruct)
函数解释gpio的初始化函数,该函数的作用是对io进行初始化。
函数参数说明:(1)GPIOx:gpio的分组,如GPIOA  GPIOB GPIOC等的宏定义。
(2)GPIO_InitStruct:gpio的初始化相关结构体。该结构体里面的成员变量决定了我们具体的初始化参数。以下进行说明:
l  GPIO_Pin:指定具体的IO脚,如GPIO_Pin_0   GPIO_Pin_1这样的宏定义,这些宏由厂家写好,我们直接使用即可。
l  GPIO_Mode:指定gpio的模式,有以下四种模式:
GPIO_Mode_IN(输入),GPIO_Mode_OUT(输出),GPIO_Mode_AF(第二功能),GPIO_Mode_AN(模拟),可以直接使用这四种宏定义。
l  GPIO_Speed:指定IO的最快翻转速度,也就是当使用IO产生频率(如PWM)的最快速度。有以下四种速度的配置:
GPIO_Low_Speed (低速),GPIO_Medium_Speed(中等速度),GPIO_Fast_Speed(快速),GPIO_High_Speed(高速),可以直接使用这四种宏定义。
l  GPIO_OType:指定选择管脚的输出类型,有以下两种配置:
GPIO_OType_PP (推挽方式输出),GPIO_OType_OD(开漏方式输出),可以直接使用这两种宏定义。
Tips:
推挽输出推挽输出是单片机引脚可以直接输出高电平电压。低电平时接地,高电平时输出单片机电源电压。这种方式可以不接上拉电阻。但如果输出端可能会接地的话,这个时候输出高电平可能引发单片机运行不稳定,甚至可能烧坏引脚。推挽方式的驱动力更大。
开漏输出:开漏输出就是不输出电压,低电平时接地,高电平时不接地。如果外接上拉电阻,则在输出高电平时电压会拉到上拉电阻的电源电压。这种方式适合在连接的外设电压比单片机电压低的时候。
l  GPIO_PuPd。指定选择管脚的上拉和下拉模式。有如下三种配置:
GPIO_PuPd_NOPULL(不上拉也不下拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)。Tips:这些都是IO的内部上拉或者下拉模式,也可以接上拉和下拉电阻通过硬件进行外部上拉和外部下拉。

3.  void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct)
函数解释gpio结构体的初始化。对GPIO_InitStruct结构体进行默认配置
函数参数说明:GPIO_InitStruct,直接传入该结构体的指针,在该函数内会对结构体进行初始化。

4.  void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
函数解释:锁定gpio的寄存器,锁定的寄存器是GPIOx_MODER,GPIOx_OTYPER, GPIOx_OSPEEDR,GPIOx_PUPDR, GPIOx_AFRL and GPIOx_AFRH。在下一次复位前,被锁定的管脚不能被修改。
函数参数说明:GPIOxgpio的分组(如GPIOA,GPIOB等)。GPIO_Pin具体的gpio管脚(如GPIO_Pin_0   GPIO_Pin_1这样的宏定义)

liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-9-8 22:43:58
 
楼主对STM32相当了解,有问题向您请教
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-9 13:01:11
 
想学习单片机这块的话,可以提供学习资料参考啊
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-10 18:18:50
 
上面已经初步了解库函数,对于stm32的学习我们需要看看这几个文档

1、ARM Cortex-M3权威指南(中文版)   这是对M3内核的了解

2、STM32F10xxx参考手册                  这个非常重要,相当于单片机的硬件手册,包括时钟、电源管理、寄存器等

3、STM32F101xx与STM32F103xx 固件函数库     这个使用库函数编程时的库函数手册

4、stm32参考手册      这个就是一些参考例程

5.  stm32芯片手册,就是对引脚功能的介绍等

现在整体看一下stm32F101和103的库函数详解
1.png


由于这些文件较大,后续通过百度网盘的形式分享给大家
huifeideyu
  • 积分:292
  • |
  • 主题:3
  • |
  • 帖子:76
积分:292
LV3
助理工程师
  • 2017-9-11 08:37:18
 
你好楼主,在编程时一个变量多个函数引用怎么处理呢
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-11 12:35:38
 
这个变量是变动的,还是静态的
huifeideyu
  • 积分:292
  • |
  • 主题:3
  • |
  • 帖子:76
积分:292
LV3
助理工程师
  • 2017-9-11 22:52:54
 
就是调用ad转换时那个变量老是编译不通过

liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-11 22:54:28
 
那应该是动态变量,直接在主函数里声明全局变量不就行了?
huifeideyu
  • 积分:292
  • |
  • 主题:3
  • |
  • 帖子:76
积分:292
LV3
助理工程师
  • 2017-9-12 12:39:01
 
现在主要是一些液晶屏显示数组需要多个c文件调用,ad转换的变量也是
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-12 14:48:01
 
在点C文件定义比如U8  buffer[1]={0,1};
在头文件中用extern引用
extern  U8  buffer[];
一定要注意头文件里不要定义,在c文件里定义

liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-12 14:55:22
 
接着更新stm32相关的资料,这是小车用的开发板 3.jpg
所有资料都在这里可以下载http://www.st.com/content/st_com ... /nucleo-f103rb.html



liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-12 15:51:47
 
继续介绍编译软件的学习,对于编译软件有很多种,有IAR FOR ARM   、keil4 、keil5等,下面是版本的网盘下载地址


IAR FOR ARM版本的链接:http://pan.baidu.com/s/1o8v2gga
keil4版本的链接:http://pan.baidu.com/s/1mh79rni 密码:v3e2
keil5版本的下载:链接:http://pan.baidu.com/s/1jHLk598 密码:1i5l
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-12 16:13:59
 
我用的keil5版本的,keil5的安装+工程的创建例程可以参考一下
http://blog.csdn.net/msdnwolaile/article/details/50904526
写的非常详细,至于注意事项,主要就是创建工程时子文件的点C和头文件路径一定要对,需要啥功能就需要在库中添加相应功能函数,
比如需要AD转换就添加stm32f10x_adc.c 不然编译时就会出错,
2.png

liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-12 17:29:05
 
      刚开始学习编程都一样,都想弄个小程序下载到开发板上看看实际的功能,就像学习51一样从点亮一个灯,流水灯 、 蜂鸣器等等,都需要一个循序渐进的过程,特别刚开始都是参考例程写的,等过一段时间自己敲代码的时候发现程序很乱,根本就没有自己的编程习惯,需要多练,多写,多做,慢慢的养成自己的一套编程思想,
      基于stm32的wifi小车,子函数和子文件较多,但是无非都是函数传递和调用,下面是简单流程图
3.jpg
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-12 17:46:53
 
       对于小车来说,PWM控制用的较多,这种控制的应用非常多,比如调光控制等等,在小车当中,通过占空比来控制速度,在stm32中,定时器较多,STM32的定时器除了TIM6和TIM7之外,其他的定时器都可以用来产生PWM输出,其中高级定时器TIM1和TIM8可以同时产生7路的PWM输出,而通用定时器也能同时产生4路的PWM输出四个通道CH1-CH4,改变占空比其实就是改变捕获比较寄存器CCR的值,具体pwm输出怎么配置
     TIMER输出PWM实现步骤
          1. 设置RCC时钟;有关RCC时钟
          2. 设置GPIO时钟;有关PWM通道的引脚配置
          3. 设置TIMx定时器的相关寄存器;
          4. 设置TIMx定时器的PWM相关寄存器。
    对于PWM的输出模式,两种模式,输出极性相反,详细的介绍参考《stm32参考手册》

liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-9-12 23:24:49
 
介绍的很详细啊
huifeideyu
  • 积分:292
  • |
  • 主题:3
  • |
  • 帖子:76
积分:292
LV3
助理工程师
  • 2017-9-13 08:27:59
 
这样定义啊,学习了,回去试试
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-13 10:35:48
 
对于直流电机的驱动用H桥电路较多,如下图所示,
3.png
电机的正反转靠对角线三极管的导通来控制,前面三极管驱动,图腾柱式的驱动电流较大,根据三极管导通的条件,前面两个信号电平相反时电机才会转,我们在这用的集成块L298N,原理图如下
2.png 在小车上用了四个直流电机,左边两个电机并联, 右边两个电机并联,四驱,驱动十足,



liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-13 11:17:55
 
     看看具体是怎么控制电机调速的,通过控制使能端使L298N处于工作和不工作,VSS-9引脚为芯片供电   VS-4引脚为电机供电   ENA-6引脚为通道1使能端,利用定时器的pwm输出作用于ENA,根据脉冲占空比不同就可以得到不同的输出电压,从而达到调速目的。比如在VS引脚加10V的电机供电电压,ENA端脉冲占空比为100%,那么OUT1和OUT2之间将输出10V电压,占空比为50%,那么输出为5V电压,占空比为10%,则为1V     我买的电机供电电压为5v到12v都可以,电压高的话也可以,长时间工作的话会对电机损坏,TIMER2.3.4.5中任一个选择PWM输出
cx123
  • cx123
  • 离线
  • LV6
  • 高级工程师
  • 积分:1901
  • |
  • 主题:44
  • |
  • 帖子:541
积分:1901
LV6
高级工程师
  • 2017-9-13 11:32:14
 
期待楼主大侠继续更新
westbrook
  • 积分:3738
  • |
  • 主题:8
  • |
  • 帖子:950
积分:3738
LV8
副总工程师
  • 2017-9-13 11:23:52
 
能否把这些个资料的网盘地址共享一下,谢谢!
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-13 11:37:19
 
stm32学习的资料都可以下载看看,最后的程序这块调试完毕会开源的,有时间会更新到HAL库共同学习
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-13 13:10:25
 
对STM8L学习可以参考一下这两个文档 STM8L培训材料-内核和架构.pdf (601.23 KB, 下载次数: 25)
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-13 14:28:24
 

1、ARM Cortex-M3权威指南(中文版)    ARM Cortex-M3权威指南.rar (4.71 MB, 下载次数: 27)

世纪电源网-九天
  • 积分:11404
  • |
  • 主题:472
  • |
  • 帖子:2539
积分:11404
超级版主
  • 2017-9-13 17:29:30
 
楼主的资料都分享出来了呀~支持下~好好学习~
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-13 17:40:44
 
谢谢支持,下载资料共同学习
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-13 17:46:53
 
    中间小插曲,继续更新PWM输出的程序
    第一步
          RCC的初始化
         现在用这个系统时钟初始化函数SystemInit();就可以了
   第二步
        GPIO的设置
   
  1. void TIM5_GPIO_Config(void)                      在这里用定时器5举个例子,CH1和CH2两个通道来控制L298的使能脚来调速
  2.      {
  3.       GPIO_InitTypeDef GPIO_InitStructure;
  4.       RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
  5.       RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

  6.       GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 | GPIO_Pin_1;
  7.       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                 
  8.       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  9.       GPIO_Init(GPIOA, &GPIO_InitStructure);
  10.       }
复制代码


liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-13 17:52:27
 
第三步定时器的设置

  1. TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  2.   TIM_OCInitTypeDef  TIM_OCInitStructure;         
  3.   TIM_TimeBaseStructure.TIM_Period = ARR;
  4.   TIM_TimeBaseStructure.TIM_Prescaler = PSC;
  5.   TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  6.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  7.   TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);
复制代码
第四步
PWM设置
  1. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; 通道1
  2.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  3.   TIM_OCInitStructure.TIM_Pulse = CRR;
  4.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  5.   TIM_OC1Init(TIM5, &TIM_OCInitStructure);
  6.   TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Enable);


  7.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  8.   TIM_OCInitStructure.TIM_Pulse = CRR;
  9.   TIM_OC2Init(TIM5, &TIM_OCInitStructure);
  10.   TIM_OC2PreloadConfig(TIM5, TIM_OCPreload_Enable);
  11.   TIM_Cmd(TIM5, ENABLE);
复制代码
设置自动装载值计算pwm频率=72M/((ARR+1)*(PSC+1))
占空比=CRR/ARR通过改变CRR捕获比较寄存器的值来改变占空比
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-13 22:29:45
 
下面看看电机怎么控制才可以正反转,左转和右转
1.bmp
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-13 22:38:14
 
正反转的原理就不多说,主要说一下左右转,双电机差速转向,所谓的差速,是指左右两车轮的速度差,假如左边车轮比右边的快,则小车会偏向右。同时,左的的车轮转速比右的慢,那么小车会向左边转动。目前主要有以下两种方式。
(1)小车向左转,可是是左轮停止或反转,右轮继续转动,这样可实现左转,这种方式实现小角度的转弯,在角度不大时可采用此种方式。
(2)小车向左转,可以是左轮反转,右轮正转,这样可以实现大角度的左转,甚至可以进行原地打转。

liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-14 11:26:17
 
看了上面电机动作的配置图后,对了小车的转向不是舵机控制的,这个角度都是固定的,开始对IO口的预定义#define DIANJI_A_EN_High              GPIO_SetBits(GPIOA,GPIO_Pin_0);     控制两个电机的速度
#define DIANJI_A_EN_Low               GPIO_ResetBits(GPIOA,GPIO_Pin_0);   
#define DIANJI_B_EN_High              GPIO_SetBits(GPIOA,GPIO_Pin_1);
#define DIANJI_B_EN_Low               GPIO_ResetBits(GPIOA,GPIO_Pin_1);   

#define DIANJI_A_CON1_HIGH            GPIO_SetBits(GPIOC,GPIO_Pin_6);     依次对应电机的IN1-IN4
#define DIANJI_A_CON1_LOW             GPIO_ResetBits(GPIOC,GPIO_Pin_6);
#define DIANJI_A_CON2_HIGH            GPIO_SetBits(GPIOC,GPIO_Pin_7);     
#define DIANJI_A_CON2_LOW             GPIO_ResetBits(GPIOC,GPIO_Pin_7);   
#define DIANJI_B_CON1_HIGH            GPIO_SetBits(GPIOC,GPIO_Pin_8);   
#define DIANJI_B_CON1_LOW             GPIO_ResetBits(GPIOC,GPIO_Pin_8);   
#define DIANJI_B_CON2_HIGH            GPIO_SetBits(GPIOC,GPIO_Pin_9);     
#define DIANJI_B_CON2_LOW             GPIO_ResetBits(GPIOC,GPIO_Pin_9);   





liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-14 11:44:41
 
对电机IO口的配置    都设置成推挽输出模式就可以了
void DIANJI_GPIO_Config(void)
{
      GPIO_InitTypeDef GPIO_InitStructure;
      RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE);
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 |GPIO_Pin_9;       
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_Init(GPIOC, &GPIO_InitStructure);
      GPIO_ResetBits(GPIOC, GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 |GPIO_Pin_9);       
}

liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-9-15 07:37:29
 
pwm的输出改变crr的值就行了吗
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-15 13:01:33
 
向上计数模式下,使能定时器后TIMx_CNT会从0开始往上数,在模式1中,如果CNT小于设置的值(TIMx_CCR1的值)那么此时CC1通道输出的是高电平,大于设置的值时是低电平,CNT继续往上数,到重装寄存器的值时会更新为0,继续一个周期


现在应该明白了吧

liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-15 13:18:27
 
在调试程序中碰到的问题 2.png
忽略了一个问题,定义变量的时候要在可执行文件前面,也就是函数开头位置

liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-9-15 20:07:03
 
是不是每次记一次数都和crr比较吗,crr越大占空比就越大
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-19 11:25:21
 
对,就是这样设置的
cx123
  • cx123
  • 离线
  • LV6
  • 高级工程师
  • 积分:1901
  • |
  • 主题:44
  • |
  • 帖子:541
积分:1901
LV6
高级工程师
  • 2017-9-15 19:48:23
 
楼主您好 请问怎么在STM8MCU里面同时可以用库函数和寄存器两种方式编程,要怎么设置?谢谢
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-15 23:07:27
 
把相关的头文件加进去加进去就可以了
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-16 21:54:55
 
寄存器的话就这两个头文件,其他根据功能需要添加相应的头文件
2.png
liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-9-17 14:18:28
 
还是寄存器操作比较直接啊,直接赋值
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-17 18:03:46
 
平时上班也没时间,周日有时间继续调试程序,结果出现编译错误..\Output\Main_Uart.axf: Warning: L6304W: Duplicate input file ..\output\system_stm32f10x.o ignored.
原因是system_stm32f10x.c文件添加了多次, 3.png
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-17 18:15:43
 
明白了,我是在我们以前做的分选机基础上做的程序,在这个USER文件里添加了 system_stm32f10x.c,但是没注意在内核文件CMSIS也有这个system_stm32f10x.c文件 4.png
删除一个后编译 5.png 整个工程文件调试完毕
liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-9-18 23:12:57
 
楼主这程序终于完了,怎么下载到板子上呢,用啥工具啊
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-21 21:42:09
 
这是ST-link的下载工具 5.png 4.jpg 用USB转串口的也可以



liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-10-3 07:37:50
 
寄存器操作方便效率很高,但是像STM32那样,寄存器太多了,用库函数的较多
huifeideyu
  • 积分:292
  • |
  • 主题:3
  • |
  • 帖子:76
积分:292
LV3
助理工程师
  • 2017-9-19 23:38:49
 
楼上也用stm8,也是8位的,库函数也可以操作吗
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-20 21:58:00
 
8位的单片机多的是,寄存器和库函数都可以操作的额,比如STC15用库函数的也不少
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-22 11:22:47
 
前面介绍直流电机的驱动,现在看一下舵机的工作原理和怎么控制
舵机的工作原理。舵机常用的控制信号是一个周期为20毫秒左右,宽度为1毫秒到2毫秒的脉冲信号。当舵机收到该信号后,会马上激发出一个与之相同的,宽度为1.5毫秒的负向标准的中位脉冲。之后二个脉冲在一个加法器中进行相加得到了所谓的差值脉冲。输入信号脉冲如果宽于负向的标准脉冲,得到的就是正的差值脉冲。如果输入脉冲比标准脉冲窄,相加后得到的肯定是负的脉冲。此差值脉冲放大后就是驱动舵机正反转动的动力信号。舵机电机的转动,通过齿轮组减速后,同时驱动转盘和标准脉冲宽度调节电位器转动。直到标准脉冲与输入脉冲宽度完全相同时,差值脉冲消失时才会停止转动!,这就是舵机的工作原理。
转动角度一般都是0到180,三根线,电源和地,一根控制线,
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-22 11:45:50
 
对**云台控制需要两个舵机,需要两个GPIO口来控制,注意脉宽的周期20ms用模拟pwm和定时器输出pwm都行,上面已经介绍了用硬件pwm的方式,这次介绍模拟pwm的原理
PWM就是一个占空比可调的方波信号,用IO口来模拟,设置一个定时器,比如循环从1数到1000,到1000的时间为PWM的周期,设置占空比N,IO口初始为高电平,当定时器计数>N的时候,IO口变为低电平,当定时器计数到1000的时候,IO口变为高电平,这样一直循环,只需调整占空比x就可以了。





liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-22 14:14:11
 
举个例子利用定时器中断模拟pwm,首先对定时器计数更新周期配置
void TIM3_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
        
        
        TIM_TimeBaseStructure.TIM_Period = 399; 这样计算定时器溢出周期400/72us
        TIM_TimeBaseStructure.TIM_Prescaler =0;
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );

        //ÖжÏÓÅÏȼ¶NVICÉèÖÃ
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);


        TIM_Cmd(TIM3, ENABLE);

void TIM3_IRQHandler(void)   //中断服务函数
{
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  
                {
                TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );   
                 pwmcount++;这是溢出次数
      if(pwmcount == 3600)//20ms  pwm的周期
     {
          pwmcount = 0;

      }
      if(pwmcount ==M)  M的值就是占空比控制舵机的转向
     
}


liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-22 17:34:26
 
所有的控制都是从串口发给单片机,单片机解析一下让io口动作超声波避障这块简单介绍一下,超声波避障小车,就是利用超声波来检测小车的前方是否有障碍物,超声波有俩个圆筒状东西,上面发的图片可以看到 ,其中一个是发射声波一个是接收声波,超声波在遇到障碍区时就会反射回来,我们通过计算从声波发射到接收的时间就可以算出其本身到障碍物的距离,计算方式为:速度(340m/s)*时间/2=距离 ,声音的在空气中传播的速度为340m/s,除以2是因为测试的时间是往返的时间,这样我们就得到了距离。
单片机的计算方法是采用定时器计数的方式:当给超声波Trig(发射端)一个高电平即开始计数,等到Echo(接收端)收到高电平信号时停止计数,得到计数值后算出时间带入上面的公式即可。

liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-23 11:49:18
 
程序这块就是必须先给模块触发脚高电平信号,短暂延时拉低信号,等到接收端输出信号是低电平停止计数,需要对引脚配置成输入悬浮模式,            
      GPIO_InitTypeDef GPIO_InitStructure;  
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;        
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
      GPIO_Init(GPIOC, &GPIO_InitStructure);
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;        
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_Init(GPIOC, &GPIO_InitStructure);
      GPIO_ResetBits(GPIOC,GPIO_Pin_8);
      GPIO_ResetBits(GPIOC,GPIO_Pin_9);



liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-23 14:22:37
 
我们要采用定时中断的方法来计算超声波发射和接受的时间,下面定时设置
TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
      RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
      TIM_DeInit(TIM4);
      TIM_TimeBaseStructure.TIM_Period=6000;  
      TIM_TimeBaseStructure.TIM_Prescaler=0;  
      TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
      TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
      TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
      TIM_PrescalerConfig(TIM4,200,TIM_PSCReloadMode_Immediate);
      TIM_ARRPreloadConfig(TIM4, DISABLE);
      TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);
      TIM_Cmd(TIM4, DISABLE);


      NVIC_InitTypeDef NVIC_InitStructure;
      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
      NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init(&NVIC_InitStructure);

liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-23 15:32:19
 
对于串口接受这块的通信协议就是普通的8n1方式,没有校验具体协议   帧头 类型位 命令位  数据位  帧尾
我们只需判断中间几位去执行相应的操作就是了


liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-23 17:17:34
 
主要的显示设备**,不是所有的**都支持openwrt系统,因为每个**驱动不一样,看看这个列表 Openwrt可用**列表.rar列表中的**可以到Openwrt官网找相应的驱动包安装。里面打绿色钩的为可以正常识别的**,其他的为未知型号。对于硬件ID的查看,可以把**插到电脑上,选择属性里的设备管理器,查看硬件ID。
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-23 17:43:35
 
      其实刚开始对wifi传输图像很感兴趣,因为没有明白其中的原理,当你明白以后就不觉得好奇了,首先我们在生活中看到的视频都是又静止的画面组成的,比如每秒传输30帧图像,由于人眼的视觉暂留效应,所以看起来就是动态的画面,到底wifi模块发送啥东西给手机APP显示呢,通过查阅资料,才了解到发送的是JPG的数据流,通过SOCKET的方式完成传输的
     看看SOCKET是怎么传输的,http://www.cnblogs.com/Sniper-qu ... /06/22/2086636.html,对网络通信了解的话,数据是通过IP和端口来传送的,肯定要建立客户端和服务器,路由器就是服务器,客户端发送JPG数据流,视频就是这样传输的


liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-25 13:19:56
 
我们了解了上面视频时怎么传输的,扩展一下摄 像 头的知识,
摄 像 头主要的Sensor图像传感器,需要图像处理芯片处理的是数字信号,所以经模数转换到图像数字信号处理IC(DSP),这个输出有的是模拟信号,有的是数字信号,现在数字信号居多,对于摄 像 头的接口,目前以mipi csi协议的传输速度较高,都达到几个G,采用最新的差分信号传输,防止干扰,单向差分串行接口,传输数据和时钟信号;对于显示器来说采用mipi dsi,最大位4  lane,一般2 lane的居多,要是能传输4 lane的话那就是真正的4K高清了
现在好多开发板都带的又mipi csi的接口,看一下具体接口定义

21.png
红圈是两路数据即2lane,

liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-9-25 22:12:01
 
这对摄 像 头还有要求啊
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-25 22:47:35
 
与摄 像 头用的芯片和驱动又关
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-25 17:23:49
 
把串口通讯这块的程序简单介绍一下
stm32F10系列当中,PA9  PA10串口引脚用的太多了,设置如下用串口中断的方式
     GPIO_InitTypeDef GPIO_InitStructure;,配置一下串口时钟,中断等
      USART_InitTypeDef USART_InitStructure;  
      NVIC_InitTypeDef NVIC_InitStructure;

      RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_Init(GPIOA, &GPIO_InitStructure);   

      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
      GPIO_Init(GPIOA, &GPIO_InitStructure);

      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
      NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 0;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                //
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                       
      NVIC_Init(&NVIC_InitStructure);       

      USART_InitStructure.USART_BaudRate = 9600;
      USART_InitStructure.USART_WordLength = USART_WordLength_8b;
      USART_InitStructure.USART_StopBits = USART_StopBits_1;
      USART_InitStructure.USART_Parity = USART_Parity_No ;
      USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
      USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
      USART_Init(USART1, &USART_InitStructure);
      USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
      USART_Cmd(USART1, ENABLE);


liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-25 17:50:26
 
简单总结一下串口通讯的方式,查询和接受
查询,查询方式就是CPU间断地查询串口的接受发送标志,决定是否进行后续处理,在查询的间隙里做其他工作。如果串口波特率较高,CPU在间隙里的任务比较重,工作时间比较长,就会出现丢失接收数据现象,因为串口接收缓冲器只有一个字节,不及时读取就会被覆盖。
中断,假设程序在不停的运行中,当串口有字符时,程序会被中断,然后执行专门的串口执行程序。执行完后,又恢复原来程序。
中断方式下单片机可以放心干其他的活,一旦串口有一个字节有效接收数据或者发送一个字节完毕,串口会立即通知CPU进行后续处理。特点是可靠、及时、占用CPU资源少。
liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-10-6 08:00:00
 
测距的话,超声波比较准确的,原理应该都是这
liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-9-23 23:53:27
 
软件模拟的PWM精度高吗
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-25 12:27:32
 
软件模拟是定时中断实现的,硬件PWM是一个外设,设置好就在一边跑了,让内核有更多时间去做其他事情,软件PWM需要一直在计算判断,如果遇到中断还会延时,实时性没硬件的高。
liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-9-25 22:17:27
 
您是说软件模拟容易被打断而且实时性不好
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-25 22:46:30
 
是啊,定时器一直在工作,中断溢出,硬件PWM比这个好
cx123
  • cx123
  • 离线
  • LV6
  • 高级工程师
  • 积分:1901
  • |
  • 主题:44
  • |
  • 帖子:541
积分:1901
LV6
高级工程师
  • 2017-9-26 21:53:51
 
STM8L怎么编程低功耗的代码?
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-26 22:15:48
 
asm("halt")这是进入停机模式,功耗很低,比如你用按键的话
if(te==0){  asm("halt");}
void KEY2Init() //PB0做外部中断
{

  PB_DDR_bit.DDR0 = 0;      //
  PB_CR1_bit.C10 = 1;       //
  PB_CR2_bit.C20 = 1;  //1   
  EXTI_CR1_bit.P0IS = 2;//2    /
  EXTI_CONF_bit.PBLIS = 0;  

}


#pragma vector = EXTI0_vector    //2       //外部中断线2_中断向量号
__interrupt void GPIOB_Line0_IRQHandler(void) //2
{
  if(EXTI_SR1_bit.P0F == 1)  //2  
  {
    delay(500);
       if(EXTI_SR1_bit.P0F == 1)
         {
           EXTI_SR1_bit.P0F = 1;//清除中断标志

           //delay(1500);
           //delay(1500);
         //PD_ODR_bit.ODR3 = 1;   //关背光

               if(te == 0) te = 1;
               else te = 0;
   }
  }
}通过外部中断来唤醒

liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-9-27 19:03:55
 
低功耗也耗电几个ma
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-10-3 07:45:56
 
能达到uA级就可以了,在进入停机模式之前把外设都关闭
liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-10-4 20:43:47
 
主要是电池需要链接一些电阻和电容,最好是能把电池直接断了
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-10-5 21:59:00
 
那这个需要一键开关机电路,可以把电池切断
liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-10-6 08:07:26
 
一个按键开关机,是用状态机吗不懂
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-10-6 22:01:01
 
可以参考这个电路,原理就不用多说了 1.jpg
liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-10-7 11:47:45
 
非常感谢啊,这个是通过按键的时间长短来进行开关机吧
liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-9-23 23:56:59
 
现在都支持库函数了
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-25 13:25:17
 
这是小车初步完成的照片,可以看一下,基本功能实现了,手机APP连接小车的wifi信号,摄 像 头可以通过wifi模块传输给APP显示,小车的前后左右都可以控制,摄 像 头采用云台控制,前后左右都可以
20.jpg
hellbaron2008
  • 积分:2954
  • |
  • 主题:20
  • |
  • 帖子:304
积分:2954
LV8
副总工程师
  • 2017-9-25 16:51:30
 
看着还可以。
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-25 17:11:56
 
楼上有啥好的建议,呵呵
hellbaron2008
  • 积分:2954
  • |
  • 主题:20
  • |
  • 帖子:304
积分:2954
LV8
副总工程师
  • 2017-9-25 17:17:10
 
搞个外壳,把它罩起来。
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-25 17:26:51
 
还想加点其他功能,您感觉啥功能不错,
hellbaron2008
  • 积分:2954
  • |
  • 主题:20
  • |
  • 帖子:304
积分:2954
LV8
副总工程师
  • 2017-9-26 08:30:54
 
电量指示,不如还能工作多久?
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-26 10:46:28
 
我以前测试12.6v的锂电池,三串三并12650的2600ma,30W放电的话能放2.5h,电量这块可以加上
liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-9-25 22:19:14
 
不错,世纪电源网写的牛
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-25 22:44:38
 
一般吧,写的不是太好
世纪电源网-九天
  • 积分:11404
  • |
  • 主题:472
  • |
  • 帖子:2539
积分:11404
超级版主
  • 2017-9-28 09:04:42
 
赞~太给力了~
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-28 11:13:00
 
后续可能会有小车遇到障碍时,小车会说话“我是21世纪电源网。。。”内容帮忙想想
huifeideyu
  • 积分:292
  • |
  • 主题:3
  • |
  • 帖子:76
积分:292
LV3
助理工程师
  • 2017-9-29 07:19:24
 
小车还会说话,带人工智能吗?
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-29 09:24:27
 
人工智能就是图标中梦想DREAM,加个语音模块试试
liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-10-6 22:50:16
 

现在stm8还有人用吗
cx123
  • cx123
  • 离线
  • LV6
  • 高级工程师
  • 积分:1901
  • |
  • 主题:44
  • |
  • 帖子:541
积分:1901
LV6
高级工程师
  • 2017-9-25 18:09:58
 
大侠 STM8里怎么同时使用寄存器和库函数编程
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-25 21:58:07
 
库函数和寄存器应该不会冲突的,可以看一下154楼
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-25 21:58:36
 
您是用STM8做啥产品啊
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-25 22:08:45
 
看看小车到底咋样,把程序下载到mcu里边看看效果,这次用串口下载软件mcuisp
可以直接下载 MCUISP.rar (731.94 KB, 下载次数: 14)
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-25 22:24:02
 
串口下载工具用的是usb转串口CH340
30.jpg
31.jpg
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-25 22:29:53
 
将硬件连接好,RXD,TXD不要连错,开始打开mcuisp下载程序,选择好COM口和波特率,DTR高电平复位,RTS高电平进bootloader就可以嗲开始编程了,
32.png
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-25 22:40:22
 
通上电看怎么工作呢,用从论坛TI在线培训兑换的小米**监控小车的工作, 33.jpg




liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-25 22:43:36
 
给小车供电用锂电池,小米**用小米充电宝,
34.jpg
我们打开手机APP连接小车的wifi
liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-9-25 22:51:38
 
这个小米的摄 像 头挺好的,清晰度咋样
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-25 22:58:04
 
马上看看录的视频
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-25 22:59:48
 
这是手机监控的画面, 35.jpg
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-25 23:25:31
 
初步功能实现的小车,看视频 22M00S.rar (3.38 MB, 下载次数: 14)
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-26 22:56:42
 
程序中还又有关IIC通讯,其实IIC通讯在工作中用的较多,接下来我们共同巩固一下这方面的知识,
I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-27 09:41:21
 
在iic通讯中,有两个地址需要注意一下不要混在一起了,
一个器件地址 device address比如24c02AT24C02的芯片地址为1010,其地址控制字格式为:1010 A2 A1 A0 R/W 。其中A2,A1,A0为可编程地址选择位。A2 A1 A0引脚接高、低电平后得到确定的三位编码,与1010形成7位编码,即为该器件的地址码。R/W为芯片读写控制位,该位为0,表示对芯片写操作,为1,表示对芯片读操作。)


一个是寻址地址word address是用来找存储空间的,其寻址范围为0x00-0xff,共256个寻址单元都是针对24c02来说的,一个地址可以存储一个字节(8位数据)

IIC协议的详细运用.docx (14.6 KB, 下载次数: 11)
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-27 23:02:21
 
具体程序中是怎么设置的,用模拟IIC的方式看看IIC的驱动怎么写
  1. //³õʼ»¯IIC
  2. void IIC_Init(void)
  3. {                                             
  4.         GPIO_InitTypeDef GPIO_InitStructure;
  5.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );       
  6.           
  7.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
  8.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //ÍÆÍìÊä³ö
  9.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  10.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  11.         GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7);         //PB10,PB11 Êä³ö¸ß
  12. }
  13. //²úÉúIICÆðʼÐźÅ
  14. void IIC_Start(void)
  15. {
  16.         SDA_OUT();     //sdaÏßÊä³ö
  17.         IIC_SDA=1;                    
  18.         IIC_SCL=1;
  19.         delay_us(4);
  20.         IIC_SDA=0;//START:when CLK is high,DATA change form high to low
  21.         delay_us(4);
  22.         IIC_SCL=0;//ǯסI2C×ÜÏߣ¬×¼±¸·¢ËÍ»ò½ÓÊÕÊý¾Ý
  23. }          
  24. //²úÉúIICÍ£Ö¹ÐźÅ
  25. void IIC_Stop(void)
  26. {
  27.         SDA_OUT();//sdaÏßÊä³ö
  28.         IIC_SCL=0;
  29.         IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
  30.         delay_us(4);
  31.         IIC_SCL=1;
  32.         IIC_SDA=1;//·¢ËÍI2C×ÜÏß½áÊøÐźÅ
  33.         delay_us(4);                                                                  
  34. }
  35. //µÈ´ýÓ¦´ðÐźŵ½À´
  36. //·µ»ØÖµ£º1£¬½ÓÊÕÓ¦´ðʧ°Ü
  37. //        0£¬½ÓÊÕÓ¦´ð³É¹¦
  38. u8 IIC_Wait_Ack(void)
  39. {
  40.         u8 ucErrTime=0;
  41.         SDA_IN();      //SDAÉèÖÃΪÊäÈë  
  42.         IIC_SDA=1;delay_us(1);          
  43.         IIC_SCL=1;delay_us(1);         
  44.         while(READ_SDA)
  45.         {
  46.                 ucErrTime++;
  47.                 if(ucErrTime>250)
  48.                 {
  49.                         IIC_Stop();
  50.                         return 1;
  51.                 }
  52.         }
  53.         IIC_SCL=0;//ʱÖÓÊä³ö0           
  54.         return 0;  
  55. }
  56. //²úÉúACKÓ¦´ð
  57. void IIC_Ack(void)
  58. {
  59.         IIC_SCL=0;
  60.         SDA_OUT();
  61.         IIC_SDA=0;
  62.         delay_us(2);
  63.         IIC_SCL=1;
  64.         delay_us(2);
  65.         IIC_SCL=0;
  66. }
  67. //²»²úÉúACKÓ¦´ð                    
  68. void IIC_NAck(void)
  69. {
  70.         IIC_SCL=0;
  71.         SDA_OUT();
  72.         IIC_SDA=1;
  73.         delay_us(2);
  74.         IIC_SCL=1;
  75.         delay_us(2);
  76.         IIC_SCL=0;
  77. }                                                                              
  78. //IIC·¢ËÍÒ»¸ö×Ö½Ú
  79. //·µ»Ø´Ó»úÓÐÎÞÓ¦´ð
  80. //1£¬ÓÐÓ¦´ð
  81. //0£¬ÎÞÓ¦´ð                          
  82. void IIC_Send_Byte(u8 txd)
  83. {                        
  84.     u8 t;   
  85.         SDA_OUT();             
  86.     IIC_SCL=0;//À­µÍʱÖÓ¿ªÊ¼Êý¾Ý´«Êä
  87.     for(t=0;t<8;t++)
  88.     {              
  89.         //IIC_SDA=(txd&0x80)>>7;
  90.                 if((txd&0x80)>>7)
  91.                         IIC_SDA=1;
  92.                 else
  93.                         IIC_SDA=0;
  94.                 txd<<=1;           
  95.                 delay_us(2);   //¶ÔTEA5767ÕâÈý¸öÑÓʱ¶¼ÊDZØÐëµÄ
  96.                 IIC_SCL=1;
  97.                 delay_us(2);
  98.                 IIC_SCL=0;       
  99.                 delay_us(2);
  100.     }         
  101. }             
  102. //¶Á1¸ö×Ö½Ú£¬ack=1ʱ£¬·¢ËÍACK£¬ack=0£¬·¢ËÍnACK   
  103. u8 IIC_Read_Byte(unsigned char ack)
  104. {
  105.         unsigned char i,receive=0;
  106.         SDA_IN();//SDAÉèÖÃΪÊäÈë
  107.     for(i=0;i<8;i++ )
  108.         {
  109.         IIC_SCL=0;
  110.         delay_us(2);
  111.                 IIC_SCL=1;
  112.         receive<<=1;
  113.         if(READ_SDA)receive++;   
  114.                 delay_us(1);
  115.     }                                         
  116.     if (!ack)
  117.         IIC_NAck();//·¢ËÍnACK
  118.     else
  119.         IIC_Ack(); //·¢ËÍACK   
  120.     return receive;
  121. }

复制代码
就主要就是IIC的初始化,怎么发送应答信号和停止信号,啥时候发送,啥时候停止,上面原理中已经介绍了



liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-27 23:06:28
 
接着就是IIC的读写程序这块,对一定长度的数据怎么写入和读取
  1. //³õʼ»¯IIC½Ó¿Ú
  2. void AT24CXX_Init(void)
  3. {
  4.         IIC_Init();
  5. }
  6. //ÔÚAT24CXXÖ¸¶¨µØÖ·¶Á³öÒ»¸öÊý¾Ý
  7. //ReadAddr:¿ªÊ¼¶ÁÊýµÄµØÖ·  
  8. //·µ»ØÖµ  :¶Áµ½µÄÊý¾Ý
  9. u8 AT24CXX_ReadOneByte(u16 ReadAddr)
  10. {                                 
  11.         u8 temp=0;                                                                                                                                                               
  12.     IIC_Start();  
  13.         if(EE_TYPE>AT24C16)
  14.         {
  15.                 IIC_Send_Byte(0XA0);           //·¢ËÍдÃüÁî
  16.                 IIC_Wait_Ack();
  17.                 IIC_Send_Byte(ReadAddr>>8);//·¢Ë͸ߵØÖ·
  18.                 IIC_Wait_Ack();                 
  19.         }else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //·¢ËÍÆ÷¼þµØÖ·0XA0,дÊý¾Ý         

  20.         IIC_Wait_Ack();
  21.     IIC_Send_Byte(ReadAddr%256);   //·¢Ë͵͵ØÖ·
  22.         IIC_Wait_Ack();            
  23.         IIC_Start();                     
  24.         IIC_Send_Byte(0XA1);           //½øÈë½ÓÊÕģʽ                           
  25.         IIC_Wait_Ack();         
  26.     temp=IIC_Read_Byte(0);                  
  27.     IIC_Stop();//²úÉúÒ»¸öÍ£Ö¹Ìõ¼þ            
  28.         return temp;
  29. }
  30. //ÔÚAT24CXXÖ¸¶¨µØַдÈëÒ»¸öÊý¾Ý
  31. //WriteAddr  :дÈëÊý¾ÝµÄÄ¿µÄµØÖ·   
  32. //DataToWrite:ҪдÈëµÄÊý¾Ý
  33. void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
  34. {                                                                                                                                                                                          
  35.     IIC_Start();  
  36.         if(EE_TYPE>AT24C16)
  37.         {
  38.                 IIC_Send_Byte(0XA0);            //·¢ËÍдÃüÁî
  39.                 IIC_Wait_Ack();
  40.                 IIC_Send_Byte(WriteAddr>>8);//·¢Ë͸ߵØÖ·
  41.          }else
  42.         {
  43.                 IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));   //·¢ËÍÆ÷¼þµØÖ·0XA0,дÊý¾Ý
  44.         }         
  45.         IIC_Wait_Ack();           
  46.     IIC_Send_Byte(WriteAddr%256);   //·¢Ë͵͵ØÖ·
  47.         IIC_Wait_Ack();                                                                                                               
  48.         IIC_Send_Byte(DataToWrite);     //·¢ËÍ×Ö½Ú                                                           
  49.         IIC_Wait_Ack();                                 
  50.     IIC_Stop();//²úÉúÒ»¸öÍ£Ö¹Ìõ¼þ
  51.         delay_ms(10);         
  52. }
  53. //ÔÚAT24CXXÀïÃæµÄÖ¸¶¨µØÖ·¿ªÊ¼Ð´È볤¶ÈΪLenµÄÊý¾Ý
  54. //¸Ãº¯ÊýÓÃÓÚдÈë16bit»òÕß32bitµÄÊý¾Ý.
  55. //WriteAddr  :¿ªÊ¼Ð´ÈëµÄµØÖ·  
  56. //DataToWrite:Êý¾ÝÊý×éÊ×µØÖ·
  57. //Len        :ҪдÈëÊý¾ÝµÄ³¤¶È2,4
  58. void AT24CXX_WriteLenByte(u16 WriteAddr,u32 DataToWrite,u8 Len)
  59. {         
  60.         u8 t;
  61.         for(t=0;t<Len;t++)
  62.         {
  63.                 AT24CXX_WriteOneByte(WriteAddr+t,(DataToWrite>>(8*t))&0xff);
  64.         }                                                                                                   
  65. }

  66. //ÔÚAT24CXXÀïÃæµÄÖ¸¶¨µØÖ·¿ªÊ¼¶Á³ö³¤¶ÈΪLenµÄÊý¾Ý
  67. //¸Ãº¯ÊýÓÃÓÚ¶Á³ö16bit»òÕß32bitµÄÊý¾Ý.
  68. //ReadAddr   :¿ªÊ¼¶Á³öµÄµØÖ·
  69. //·µ»ØÖµ     :Êý¾Ý
  70. //Len        :Òª¶Á³öÊý¾ÝµÄ³¤¶È2,4
  71. u32 AT24CXX_ReadLenByte(u16 ReadAddr,u8 Len)
  72. {         
  73.         u8 t;
  74.         u32 temp=0;
  75.         for(t=0;t<Len;t++)
  76.         {
  77.                 temp<<=8;
  78.                 temp+=AT24CXX_ReadOneByte(ReadAddr+Len-t-1);                                             
  79.         }
  80.         return temp;                                                                                                   
  81. }
  82. //¼ì²éAT24CXXÊÇ·ñÕý³£
  83. //ÕâÀïÓÃÁË24XXµÄ×îºóÒ»¸öµØÖ·(255)À´´æ´¢±êÖ¾×Ö.
  84. //Èç¹ûÓÃÆäËû24CϵÁÐ,Õâ¸öµØÖ·ÒªÐÞ¸Ä
  85. //·µ»Ø1:¼ì²âʧ°Ü
  86. //·µ»Ø0:¼ì²â³É¹¦
  87. u8 AT24CXX_Check(void)
  88. {
  89.         u8 temp;
  90.         temp=AT24CXX_ReadOneByte(255);//±ÜÃâÿ´Î¿ª»ú¶¼Ð´AT24CXX                           
  91.         if(temp==0X55)return 0;                  
  92.         else//ÅųýµÚÒ»´Î³õʼ»¯µÄÇé¿ö
  93.         {
  94.                 AT24CXX_WriteOneByte(255,0X55);
  95.             temp=AT24CXX_ReadOneByte(255);         
  96.                 if(temp==0X55)return 0;
  97.         }
  98.         return 1;                                                                                          
  99. }

  100. //ÔÚAT24CXXÀïÃæµÄÖ¸¶¨µØÖ·¿ªÊ¼¶Á³öÖ¸¶¨¸öÊýµÄÊý¾Ý
  101. //ReadAddr :¿ªÊ¼¶Á³öµÄµØÖ· ¶Ô24c02Ϊ0~255
  102. //pBuffer  :Êý¾ÝÊý×éÊ×µØÖ·
  103. //NumToRead:Òª¶Á³öÊý¾ÝµÄ¸öÊý
  104. void AT24CXX_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)
  105. {
  106.         while(NumToRead)
  107.         {
  108.                 *pBuffer++=AT24CXX_ReadOneByte(ReadAddr++);        
  109.                 NumToRead--;
  110.         }
  111. }  
  112. //ÔÚAT24CXXÀïÃæµÄÖ¸¶¨µØÖ·¿ªÊ¼Ð´ÈëÖ¸¶¨¸öÊýµÄÊý¾Ý
  113. //WriteAddr :¿ªÊ¼Ð´ÈëµÄµØÖ· ¶Ô24c02Ϊ0~255
  114. //pBuffer   :Êý¾ÝÊý×éÊ×µØÖ·
  115. //NumToWrite:ҪдÈëÊý¾ÝµÄ¸öÊý
  116. void AT24CXX_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)
  117. {
  118.         while(NumToWrite--)
  119.         {
  120.                 AT24CXX_WriteOneByte(WriteAddr,*pBuffer);
  121.                 WriteAddr++;
  122.                 pBuffer++;
  123.         }
  124. }复制过来汉字不见了 IIC.rar (3.5 KB, 下载次数: 11)
复制代码

liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-27 23:15:00
 
在小车中,我们主要是用来储存电机的速度和云台的角度,比如舵机的初始化
void Init_Steer()
{
  u8 i,l,r;
  I2C_EEPROM_Init();
  I2C_EEPROM_BufferRead(Angle,0x00,8);//´Óeeprom¶ÁÈ¡½Ç¶ÈÖµ
  if((Angle[0]==0xff)||(Angle[1]==0xff)||(Angle[2]==0xff)||(Angle[3]==0xff)||(Angle[4]==0xff)||(Angle[5]==0xff)||(Angle[6]==0xff)||(Angle[7]==0xff))//Èç¹û´Óδ±£´æ¹ý½Ç¶È
  {
    for(i=0;i<8;i++)
    {
      Angle=0x3C;//¸³³õÖµ
    }
     I2C_EEPROM_BufferWrite(Angle,0x00,8);//±£´æ   
  }
    adjust=I2C_EEPROM_ReadByte(0x10);//´æ´¢µç»úУ׼±êÖ¾
    if(adjust==0xff)adjust=1;//´Óδ±£´æ¹ýÔò¸³1
    l=I2C_EEPROM_ReadByte(0x09);//´Óeeprom¶ÁÈ¡×ó²àµµÎ»ÊýÖµ
    r=I2C_EEPROM_ReadByte(0x0a);//´Óeeprom¶ÁÈ¡ÓҲ൵λÊýÖµ
    if((l>100)||(r>100))//ÅжϵµÎ»ÊýÖµÊÇ·ñºÏÀí
    {
      l=100;
      r=100;
    }
    speed_left=l*8+200;//µµÎ»Öµ»»Ëã³ÉËÙ¶ÈÖµ
    speed_right=r*8+200;//µµÎ»Öµ»»Ëã³ÉËÙ¶ÈÖµ

}

初始化肯定恢复原位的角度,
huifeideyu
  • 积分:292
  • |
  • 主题:3
  • |
  • 帖子:76
积分:292
LV3
助理工程师
  • 2017-9-29 07:13:50
 
我一直不明白通讯中主和从怎么说的
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-29 08:34:08
 
忘了分享iic通讯的四种模式,
主发、主收、从发、从收
我们平时用的大部分都是MCU为主,eeprom为从,比如主发可以从start开始主动发,但是从发一定是先接收到地址之后再被动发,所以模式是分开的。
还有就是读和写是站在主机的立场定义的,读是主机接受从机数据,写是主机发送数据给从机注意:读数据的时候也要先进行写操作,目的是写入器件地址以寻找合适的器件,当器件与地址匹配时,器件会发出一个应答信号,这样就可以让单片机确定该读哪个器件,这样就可以开始读取数据了.
huifeideyu
  • 积分:292
  • |
  • 主题:3
  • |
  • 帖子:76
积分:292
LV3
助理工程师
  • 2017-9-30 21:03:32
 
这个iic通讯是不是不想串口那样是双向通讯吗
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-30 22:36:19
 
区别可大了,iic是一条数据线来收发,不能同时进行的,
liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-9-27 19:06:24
 
楼主的车功能实现了
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-27 22:05:26
 
已经初步完成了,您感觉咋样?
liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-9-28 07:14:32
 
期待新的功能,对了,您程序写eeprom是隔一段时间写一次?
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-28 12:52:04
 
要是电机速度的话,调一次速度需要写入eeprom一次,下次上电读取eeprom从而记忆速度,这个频率不会太频繁,要是在其他产品中,写入频率较高的话可以隔一段时间写入一次
liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-9-28 22:49:01
 
说的对,写的频率太快的话对24c02的寿命影响
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-28 23:22:26
 
可以采用以上的方式,或者选用擦写次数大的eeprom
huifeideyu
  • 积分:292
  • |
  • 主题:3
  • |
  • 帖子:76
积分:292
LV3
助理工程师
  • 2017-10-9 20:54:41
 
这是在论坛兑换的,挺不错,看家挺好的
huifeideyu
  • 积分:292
  • |
  • 主题:3
  • |
  • 帖子:76
积分:292
LV3
助理工程师
  • 2017-9-27 21:30:53
 
写的不错,让我们这些新手好好学学,
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-27 22:08:52
 
我们共同学习MCU控制这块,
gst0311
  • 积分:362
  • |
  • 主题:7
  • |
  • 帖子:54
积分:362
LV4
初级工程师
  • 2017-9-28 14:58:15
 
不错哦,学习学习
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-28 22:14:26
 
谢谢支持,您是对单片机感兴趣?
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-28 23:07:43
 
我分享的额又啥建议没?
huifeideyu
  • 积分:292
  • |
  • 主题:3
  • |
  • 帖子:76
积分:292
LV3
助理工程师
  • 2017-9-29 07:25:56
 
额想做一个平衡小车,不知道怎么控制
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-29 08:11:18
 
有时间的话会简单分享一下平衡小车,共同学习
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-29 12:37:01
 
为了让程序移植方便,现在都用hAl库,况且STMF7系列全部都是HAL库,试着学习一下开始把程序更新到HAL库,先用CubeMX的图形化界面配置好你需要的各个外设,引脚,时钟等信息,然后生成代码,在规定的地方输入自己的代码就可以了
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-29 12:49:32
 
下面是STM32CubeMX介绍、下载与安装的教程http://blog.csdn.net/ybhuangfugui/article/details/52225736这是软件的安装包链接:http://pan.baidu.com/s/1kVoV9o7 密码:gqv6





liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-29 13:01:32
 
1.新建stm32工程
上面把软件和库安装好后,我们一起来新建一个工程
  我们打开软件 20.png 点击新建工程
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-29 13:10:44
 
打开以后是选择器件板子,可以根据MCU进行选择,也可以根据board型号选择,board型号主要是针对ST推出的Nucleo板子,
21.png
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-29 13:40:52
 
我们开始选择MCU型号,封装等,左边和右边都可以,打开以后就看到各个外设了 23.png 需要用到那个外设就选择那个就可以了






24.png
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-29 17:40:54
 
2.配置STM32相关外设
首先我们需要配置RCC,我们选择选择HSE(外部高速时钟)Crystal/Ceramic Resonator(晶振/陶瓷谐振器) 25.png



liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-29 17:52:06
 
对于gpio的设置可以从模型上直接点击来配置模式 26.png
注意黄色引脚为该功能的GPIO已被用作其他功能,可以忽略。绿色表示管脚已使用)



liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-29 18:03:55
 
3.配置STM32时钟

时钟树一目了然,由于STM32最高时钟为72M,只需要在HCLK处输入72,软件即可自动配置。(RCC选择外部高速时钟)。
27.png








liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-29 18:17:39
 
4.STM32的具体功能外设配置
28.png
点击GPIO可以对其配置详细的推挽输出,上拉,下拉等模式
29.png
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-29 18:26:38
 
5.生成工程报告文件
功耗计算没啥,需要用到时再配置,点击Project –>Generate Reports或者点击快捷图标生成报告。系统会提示先创建一个工程项目。点击Yes设置工程。 30.png

31.png
红色圈时注意事项,选择工程路径(注意不要出现中文,否则可能出错)。工具链/IDE选择MDK-ARM V5。最后面可以设置堆栈大小,此处默认不作修改。



liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-29 18:35:14
 
32.png 在Code Generator中找到Generated files框,勾选Generated periphera initialization as a pair of '.c/.h' files per IP。外设初始化为独立的C文件和头文件

点击生成报告,工程目录下会生成txt文件和pdf文件,里面记录了我们刚才的设置

liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-29 18:44:09
 
6.生成STM32的工程代码
点击Project –>Generate Code或者点击快捷图标生成工程代码。
33.png
点击Open Project打开工程。到这里工程的外设已初始化
35.png
我们可以在while(1)循环中添加程序




liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-9-29 21:22:18
 
这教程很到位,现在都更新hal库了,的确这也是一种趋势了
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-29 22:56:17
 
您也用过HAL库吗
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-30 11:44:27
 
7.定时器的设置
我们前面已经对这个工程的创建有个大概的认识,下面需要对定时器相关配置

36.png

我们打开昨天创建的红色圈内的文件,做详细的配置。先对电机的pwm配置
37.png
在红色圈内的就是定时器的配置


liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-30 11:52:25
 
继续对pwm的模式,计数等设置 50.png
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-30 16:43:03
 
8.串口的设置
选择USART1的异步通信方式,PA9为TX发送,PA10为RX接受
52.png
串口配置设置波特率为115200 Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1.其他参数默认
53.png





liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-30 16:57:49
 
     串口用的非常多,简单总结一下,在串行通信中,一个字符一个字符地传输,每个字符一位一位地传输,并且传输一个字符时,总是以“起始位”开始,以“停止位”结束。在进行传输之前,双方一定要使用同一个波特率设置。波特率就是每秒钟传输的数据位数。串口的方式分为HAL 库轮询,中断,DMA 三种编程模型,记得前面说过      通信方式分为同步和异步,我们通常使用的是异步通信方式.异步通信规定传输的数据格式由起始位(start bit)、数据位(data bit)、奇偶校验位(parity bit)和停止位(stop bit)组成。
     记得以前学51单片机时只有轮询和中断两种方式,不多说了,第三种DMA方式就是直接存储器访问,其实就是可以在无需任何 CPU 操作的情况下通过 DMA 快速传输数据,这样节省的 CPU 资源可供其它操作使用,说白了DMA就是一个搬运工,将数据从一个地方搬到另一个地方而不需要CPU处理。
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-30 17:07:03
 
看看用图形化界面是怎么设置的
55.png
在DMA设置栏添加UASART发送TX的DMA。通道自动选择的,方向从存储器到外设。优先级为低。Mode为Normal,Data Width选择Byte。

liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-30 17:21:00
 
9.模数转换AD的设置
后续有时间加上电量显示的,通过ADC轮询的方式采集单通道的数据。
56.png
用DMA的方式采集数据是怎么样的,
57.png
ADC1配置:使能扫描转换模式(Scan Conversion Mode),使能连续转换模式(Continuous Conversion Mode),使能DMA连续请求。ADC规则组选择转换通道数为1(Number Of Conversion)。其他为默认设置。


liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-30 17:27:05
 
10.IIC的设置

iiC的通讯原理上面已经讲解了,看看是怎么配置的
58.png


I2C为默认设置不作修改。只需注意一下,I2C为标准模式,I2C传输速率(I2C Speed Frequency)为100KHz。





59.png
huifeideyu
  • 积分:292
  • |
  • 主题:3
  • |
  • 帖子:76
积分:292
LV3
助理工程师
  • 2017-10-9 20:35:08
 
这教程相当详细啊,有时间也学学hal
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-10-9 22:27:41
 
网上有很多教程可以看看,一步一步的学习
huifeideyu
  • 积分:292
  • |
  • 主题:3
  • |
  • 帖子:76
积分:292
LV3
助理工程师
  • 2017-9-30 21:35:33
 
楼主有hal库的库文件吗
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-30 22:30:49
 
肯定有HAL库文件,没有库文件,你写的程序和谁对接啊,其实就是个接口文件
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-9-30 22:41:49
 
都放假8天了,帖子快更新完了,为DREAM而加油
电子仔
  • 积分:140
  • |
  • 主题:9
  • |
  • 帖子:24
积分:140
LV2
本网技师
  • 2017-10-2 12:19:24
 
为楼主加个油
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-10-2 16:47:03
 
谢谢,对于MCU控制这块,可以吐槽
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-10-2 18:11:16
 
前面的基本功能都会了,我们通过STM32的CUBE生成robot的配置代码 1.png

有关定时器.GPIO.串口的初始化已经好了,下面需要把程序移植到while(1)LOOP中

liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-10-2 22:08:30
 
其实和STD库一样,都需要再不厌其烦的添加文件、添加编译路径(你就可以把之前移植时修改好的文件复制过来,大部分内容不用再次修改)主要是一些头文件都需要改,名字都不一样,Hal库使用串口的时候,串口中断实际上的开与否是由HAL函数接管的。看源码可以看到,在HAL_USART_TransmitReceive_IT和HAL_USART_Receive_IT函数中有一处是打开中断的操作。当调用上面这两个函数的时候,HAL会打开发送/接收中断,当操作完成后,会把中断关掉,这时就接收不到消息了。





liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-10-3 07:02:11
 
都说hal库的效率不高
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-10-3 12:23:00
 
我们在移植程序前简单回顾一下定时器的使用,定时器在程序中太广泛了,看看几种延时的方法
1.循环延时法
在51单片机中经常用
void delay(u8  MS)
{
for循环
}
2.滴答定时器延时
这个是内核里面的24位的倒计时Systick定时器,用着非常方便
3.定时中断法
就是用 定时器计数溢出中断,具体原理前面已经讲过了
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-10-3 12:33:28
 
这个效率网上都说寄存器>标准库>HAL库,实际应用当中感觉不出来
huifeideyu
  • 积分:292
  • |
  • 主题:3
  • |
  • 帖子:76
积分:292
LV3
助理工程师
  • 2017-10-3 20:19:20
 
楼主还是不要用hal库了,好多坑等着你,可以把标准库的源码分享一下
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-10-4 20:12:29
 
源码的新功能正在完善,肯定会分享的,HAL库也在逐步学习
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-10-3 12:54:40
 
我们在这里用了三个中断,两个定时器中断,一个串口中断
首先选择中断优先级分组,
Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下:
第0组:所有4位用于指定响应优先级
第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级
第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
第4组:所有4位用于指定抢占式优先级

然后选择抢占优先级和响应优先级
我们选择分组1,中断嵌套这块,由于串口中断最频繁,设置优先级最高,次之就是舵机了,最后就是超声波避障
huifeideyu
  • 积分:292
  • |
  • 主题:3
  • |
  • 帖子:76
积分:292
LV3
助理工程师
  • 2017-10-3 20:10:33
 
这样中断嵌套的话,不会出现冲突吗
liguanghui2588
  • 积分:8306
  • |
  • 主题:43
  • |
  • 帖子:2279
积分:8306
LV7
实习版主
  • 2017-10-4 20:07:49
 
把优先级设置好就可以了,不会出现冲突啊
liuxiaofei126
  • 积分:2810
  • |
  • 主题:4
  • |
  • 帖子:810
积分:2810
LV8
副总工程师
  • 2017-10-4 20:26:41
 
我也是学习,用标准库较多,中断较多的话要上操作系统吗