ESP8266 使用 DRV8833驱动板驱动N20电机
RT
手里这块ESP8266是涂鸦的板子,咸鱼上三块一个买了一堆,看ESP8266-12F引脚都差不多的。裸焊了个最小系统,加两个按钮(一个烧录,一个复位)
1. 准备工作
搜索过程中发现 DRV8833四路输入口需要PWM,而8266中的PWM口有4个IO口。但是我看到网上有人说“RSP8266中基本上数字IO都可以作为PWM复用引脚”,我不清楚。
之前我把GPIO15接地了。因为网上一些人说要接地,以及涂鸦文档中有说GPIO15涉及到初始化过程,所以我以为这个引脚是不能用的
试着去掉后,发现可以正常烧录和运行。那就这么着了,反正你引脚都引出来了,我应该可以随便折腾,我也不用wifi功能,至于GPIO15能不能用还得等后续验证。
下面是现在的烧录和复位最小系统图:去掉GPIO15到GND这条线
2. PWM 呼吸灯测试
因为实在RTOS下开发的,所以手册先放上来。esp8266-rtos-sdk PWM
RTOS下也有示例代码:ESP8266_RTOS_SDK\examples\peripherals\pwm
PWM重要参数:
频率:1/Ts(周期)
占空比:Ton/Ts
在频率一定时,可通过不同占空比来改变LED亮度,就达到呼吸灯效果了。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "esp_log.h"
#include "esp_system.h"
#include "esp_err.h"
#include "esp8266/gpio_register.h"
#include "esp8266/pin_mux_register.h"
#include "driver/pwm.h"
//#define PWM_0_OUT_IO_NUM 12
//#define PWM_1_OUT_IO_NUM 13
//#define PWM_2_OUT_IO_NUM 14
#define PWM_3_OUT_IO_NUM 15
// PWM period 1000us(1Khz), same as depth
// 周期
#define PWM_PERIOD (1000)
static const char *TAG = "pwm_example";
// pwm pin number
const uint32_t pin_num[1] = {
// PWM_0_OUT_IO_NUM,
// PWM_1_OUT_IO_NUM,
// PWM_2_OUT_IO_NUM,
PWM_3_OUT_IO_NUM
};
// duties table, real_duty = duties[x]/PERIOD
// 占空比
uint32_t duties[1] = {
// 10000, 10000, 10000,
500,
};
// phase table, delay = (phase[x]/360)*PERIOD
// 相位
float phase[1] = {
0
};
// #define configTICK_RATE_HZ 1000
void app_main()
{
pwm_init(PWM_PERIOD, duties, 1, pin_num);
pwm_set_phases(phase);
pwm_start();
char flag = 0;
uint16_t count = 1;
while (1) {
if(flag){
count--;
}else{
count++;
}
if(count>=1000){
flag=1;
ESP_LOGI(TAG, "PWM 1000\n");
}else if(count<=1){
flag = 0;
ESP_LOGI(TAG, "PWM 0\n");
// 熄灭后停留
vTaskDelay(pdMS_TO_TICKS(300));
}
// 设置占空比
pwm_set_duty(0, count);
pwm_start();
vTaskDelay(pdMS_TO_TICKS(2));
}
}
15号引脚上的PWM呼吸灯如下:
测试PWM的呼吸灯
3. DRV8833 驱动板连接
网上找到接线图,来试试
放在我的电路中的接线图
焊接,焊接完成后,串口信息报错
Fatal exception (0):
epc1=0x4013ffff, epc2=0x00000000, epc3=0x00000000, excvaddr=0x00000000, depc=0x00000000
应该是焊的时候碰到以前的引脚了或者新焊接的线影响了运行
重新烧录下程序,烧录按钮按下,按复位毫无反应,排查下问题。
最后发现是GPIO2影响了,因为GPIO2在模块启动的时候如果拉低会启动失败。我也搞不懂为什么现在接的是VCC但是是低电平。和GPIO15换个位置吧。
4. 代码部分
供电
首先GPIO15要供电,输出高电平:
#include "driver/gpio.h"
#define GPIO_15 15
void app_main()
{
// 不是RTOS中的配置方式
// 配置 IO15 为 GPIO功能
// PIN_FUNC_SELECT(PERIPHS_GPIO_MUX_REG(15), FUNC_GPIO15);
// 设置高电平
// GPIO_OUTPUT_SET(15, 1);
// 配置IO15为输出
gpio_config_t ioConf;
ioConf.intr_type = GPIO_INTR_DISABLE;
ioConf.mode = GPIO_MODE_OUTPUT;
ioConf.pin_bit_mask = (1ULL<<GPIO_15);
ioConf.pull_down_en = 0;
ioConf.pull_up_en = 0;
gpio_config(&ioConf);
// 输出高电平
gpio_set_level(GPIO_15, 0);
供电后,驱动板上的LED亮了。
四路PWM输出
#define PWM_0_OUT_IO_NUM 12
#define PWM_1_OUT_IO_NUM 13
#define PWM_2_OUT_IO_NUM 14
#define PWM_3_OUT_IO_NUM 2
// PWM period 1000us(1Khz), same as depth
// 周期
#define PWM_PERIOD (1000)
// pwm pin number
const uint32_t pin_num[4] = {
PWM_0_OUT_IO_NUM,
PWM_1_OUT_IO_NUM,
PWM_2_OUT_IO_NUM,
PWM_3_OUT_IO_NUM
};
// duties table, real_duty = duties[x]/PERIOD
// 占空比
uint32_t duties[4] = {
500,
500,
500,
500,
};
// phase table, delay = (phase[x]/360)*PERIOD
// 相位
float phase[4] = {
0, 0, 0, 0,
};
void app_main()
{
...
// 配置四路PWM口
pwm_init(PWM_PERIOD, duties, 4, pin_num);
pwm_set_phases(phase);
pwm_start();
串口日志输出:
gpio: GPIO[15]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0 [0m
gpio: GPIO[2]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0 [0m
gpio: GPIO[12]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0 [0m
gpio: GPIO[13]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0 [0m
gpio: GPIO[14]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0 [0m
pwm: --- PWM v3.4
现在通电后,电机没转动,但是有响声。
是因为驱动方式不对,看看DRV8833的逻辑控制:
现在IO12和IO13都是PWM输出,就会肯定就动不了的。将IO13设为低电平就可以了。
速度不够快,先把占空比调大一些。确实快了。再将频率设置为10Khz,速度相比1Khz好像没提升。如果还想增加转速是不是只能增加电压?现在只是3.3的电压太小了。
不过现在总算是转起来了
以及总览图:
完整代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "esp_log.h"
#include "esp_system.h"
#include "esp_err.h"
#include "esp8266/gpio_register.h"
#include "esp8266/pin_mux_register.h"
#include "driver/pwm.h"
#include "driver/gpio.h"
#define PWM_0_OUT_IO_NUM 12
#define GPIO_15 15
#define GPIO_13 13
// PWM period 1000us(1Khz), same as depth
// 周期 1ms=1Khz 100us=10Khz
#define PWM_PERIOD (1000)
// pwm pin number
const uint32_t pin_num[1] = {
PWM_0_OUT_IO_NUM,
};
// duties table, real_duty = duties[x]/PERIOD
// 占空比
uint32_t duties[1] = {
999,
};
// phase table, delay = (phase[x]/360)*PERIOD
// 相位
float phase[1] = {
0
};
void app_main()
{
// 配置IO15为输出
gpio_config_t ioConf;
ioConf.intr_type = GPIO_INTR_DISABLE;
ioConf.mode = GPIO_MODE_OUTPUT;
ioConf.pin_bit_mask = (1ULL<<GPIO_15);
ioConf.pull_down_en = 0;
ioConf.pull_up_en = 0;
gpio_config(&ioConf);
// 输出高电平
gpio_set_level(GPIO_15, 1);
// 配置IO13为输出
ioConf.intr_type = GPIO_INTR_DISABLE;
ioConf.mode = GPIO_MODE_OUTPUT;
ioConf.pin_bit_mask = (1ULL<<GPIO_13);
ioConf.pull_down_en = 0;
ioConf.pull_up_en = 0;
gpio_config(&ioConf);
// 输出高电平
gpio_set_level(GPIO_13, 0);
// 配置一路PWM口
pwm_init(PWM_PERIOD, duties, 1, pin_num);
pwm_set_phases(phase);
pwm_start();
}
其他参考:
- TYWE3L 模组规格书
- esp8266-rtos-sdk PWM
- ESP8266学习历程(4)——PWM
- DRV8833直流电机驱动板在智能小车的应用
- ESP8266引脚的说明
- ESP8266学习历程——GPIO配置
- 【电机驱动芯片(H桥、直流电机驱动方式)——DRV8833、TB6612、A4950、L298N的详解与比较】
ESP8266 使用 DRV8833驱动板驱动N20电机的更多相关文章
- Arduino连接L298n驱动板驱动小车的电机
1.L298N介绍 先来讲讲电机驱动,驱动一般使用L298N,L298N 是一种双H桥电机驱动芯片,其中每个H桥可以提供2A的电流,功率部分的供电电压范围是2.5-48v,逻辑部分5v供电,接受5vT ...
- Arduino CNC Shiled 和 DRV8825驱动板的注意事项
首先说明硬件:1) Arduino CNC Shiled V2.6 2)DRV8825驱动板 3)光驱步进电机 4)Arduino uno R3 下图是本次主角是Arduino CNC Shile ...
- Arduino UNO开发板、Arduino CNC Shield V3.0扩展板、A4988驱动板、grbl固件使用教程
前言 CNC Shield V3.0可用作雕刻机,3D打印机等的驱动扩展板,板上一共有4路步进电机驱动模块的插槽,可驱动4路不进电机,而每一路步进电机都只需要2个IO口,也就是说,6个IO口就可以很好 ...
- 裸板驱动总结(makefile+lds链接脚本+裸板调试)
在裸板2440中,当我们使用nand启动时,2440会自动将前4k字节复制到内部sram中,如下图所示: 然而此时的SDRAM.nandflash的控制时序等都还没初始化,所以我们就只能使用前0~40 ...
- 迅为iTOP-4418/6818开发板-驱动-实现GPIO扩展
实现 GPIO 扩展,先弄清楚“复用”的概念,将调用这些 GPIO 的驱动去掉配置,重新编译,加到自己的驱动中,就可以实现扩展的 GPIO 的输入和输出.另外必须要先看文档“迅为iTOP-4418开发 ...
- arm裸板驱动总结(makefile+lds链接脚本+裸板调试)
在裸板2440中,当我们使用nand启动时,2440会自动将前4k字节复制到内部sram中,如下图所示: 然而此时的SDRAM.nandflash的控制时序等都还没初始化,所以我们就只能使用前0~40 ...
- RK30SDK开发板驱动分析(二):DDR频率配置
在内核配置界界面,我们可以很容易的配置DDR的频率,300M OR 600M, so easy! 那么它是如何起作用的呢? 回想 RK30SDK开发板驱动分析(一) 末尾提到MACHINE_START ...
- 东方步进电机马达驱动板CVK系列说明书
东方步进电机马达驱动板CVK系列说明书
- (笔记)linux设备驱动--LED驱动
linux设备驱动--LED驱动 最近正在学习设备驱动开发,因此打算写一个系列博客,即是对自己学习的一个总结,也是对自己的一个督促,有不对,不足,需要改正的地方还望大家指出,而且希望结识志同道合的朋友 ...
随机推荐
- java高级用法之:JNA中的Function
目录 简介 function的定义 Function的实际应用 总结 简介 在JNA中,为了和native的function进行映射,我们可以有两种mapping方式,第一种是interface ma ...
- zipper题解
-请奆佬们洁身自好,好好打代码从我做起 - 题目大意: 给三个字符串,判断C字符串是否由A B字符串顺序组成, 题意分析: 很容易想到的是,A的长度加上B的长度为C的长度 其实进一步想,这 提供了一个 ...
- HTTP.sys远程执行代码漏洞检测
1.漏洞描述:HTTP 协议栈 (HTTP.sys) 中存在一个远程执行代码漏洞,这是 HTTP.sys 不正确地分析特制 HTTP 请求时导致的.成功利用此漏洞的攻击者可以在系统帐户的上下文中执行任 ...
- DevOps之敏捷开发
初步了解一下敏捷开发及其流程 1 为什么要敏捷开发? 敏捷开发描述了一套软件开发的价值和原则,在这些开发中,需求和解决方案皆通过自组织跨功能团队达成. 1.1 背景与动机 当需求的不明确性和工程实现的 ...
- 用python实现自动化登录禅道系统 设置定时器自动执行脚本
由于各种原因,我想试下用python实现自动登录禅道系统,并且每天定时执行.(本人第一次接触自动化,在大佬眼中门槛都没摸到的类型) 首先缕清思路: 1.实现自动登录禅道系统,用selenium实现2. ...
- 记 iTextSharp 剪裁 PDF 指定区域的方法
原文 引用 itextsharp 5.5.13.2 itextsharp.xtra 5.5.13.2 方法 /// <summary> /// 截取pdf文件,例如把A4截出指定的A6区域 ...
- 线程安全性-原子性之synchronized锁
原子性提供了互斥访问:同一时刻只能有一个线程进行操作: 除了Atomic包类之外,还有锁可以实现此功能: synchronized: java关键字,依赖于jvm实现锁功能,被此关键字所修饰的,都是 ...
- Java编码安全
目录 Java编码安全 数据校验 规则1.1:校验跨信任边界传递的不可信数据 规则1.2:禁止直接使用不可信数据来拼接SQL语句 规则1.4:禁止直接使用不可信数据来记录数据 规则1.6:验证路径前将 ...
- C语言- 基础数据结构和算法 - 队列的顺序存储
听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...
- 商户编号[Merchant Id]是什么
1. Merchant Id是什么 2. Merchant Id 是有哪几个部分构成的 2.1 收单机构代码 2.2 商户地区代码 2.3 Merchant Category Code(MCC) 本文 ...