热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

ESP8266使用DRV8833驱动板驱动N20电机

RT手里这块ESP8266是涂鸦的板子,咸鱼上三块一个买了一堆,看ESP8266-12F引脚都差不多的。裸焊了个最小系统,加两个按钮(一个烧录,一个复位)1.准备工作搜索过程中发现

RT

手里这块ESP8266是涂鸦的板子,咸鱼上三块一个买了一堆,看ESP8266-12F引脚都差不多的。裸焊了个最小系统,加两个按钮(一个烧录,一个复位)

图1 现状


1. 准备工作

搜索过程中发现 DRV8833四路输入口需要PWM,而8266中的PWM口有4个IO口。但是我看到网上有人说“RSP8266中基本上数字IO都可以作为PWM复用引脚”,我不清楚。

图2 ESP8266中的PWM。来自乐鑫- ESP8266 技术参考手册.pdf

之前我把GPIO15接地了。因为网上一些人说要接地,以及涂鸦文档中有说GPIO15涉及到初始化过程,所以我以为这个引脚是不能用的

图3 涂鸦 TYWE3L 模组规格书中关于GPIO的描述

试着去掉后,发现可以正常烧录和运行。那就这么着了,反正你引脚都引出来了,我应该可以随便折腾,我也不用wifi功能,至于GPIO15能不能用还得等后续验证。

下面是现在的烧录和复位最小系统图:去掉GPIO15到GND这条线

图4 ESP8266最小系统图


2. PWM 呼吸灯测试

因为实在RTOS下开发的,所以手册先放上来。esp8266-rtos-sdk PWM

RTOS下也有示例代码:ESP8266_RTOS_SDK\examples\peripherals\pwm

PWM重要参数:

频率:1/Ts(周期)

占空比:Ton/Ts

在频率一定时,可通过不同占空比来改变LED亮度,就达到呼吸灯效果了。

#include
#include
#include
#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的呼吸灯

放在我的电路中的接线图

图6 自己系统中的接线图

焊接,焊接完成后,串口信息报错

Fatal exception (0):
epc1=0x4013ffff, epc2=0x00000000, epc3=0x00000000, excvaddr=0x00000000, depc=0x00000000

应该是焊的时候碰到以前的引脚了或者新焊接的线影响了运行

重新烧录下程序,烧录按钮按下,按复位毫无反应,排查下问题。

最后发现是GPIO2影响了,因为GPIO2在模块启动的时候如果拉低会启动失败。我也搞不懂为什么现在接的是VCC但是是低电平。和GPIO15换个位置吧。

图7 修改GPIO2<>15


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< 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 
gpio: GPIO[2]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0 
gpio: GPIO[12]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0 
gpio: GPIO[13]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0 
gpio: GPIO[14]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0 
pwm: --- PWM v3.4

现在通电后,电机没转动,但是有响声。

是因为驱动方式不对,看看DRV8833的逻辑控制:

图8 DRV8833逻辑控制1

图9 DRV8833逻辑控制2

现在IO12和IO13都是PWM输出,就会肯定就动不了的。将IO13设为低电平就可以了。

速度不够快,先把占空比调大一些。确实快了。再将频率设置为10Khz,速度相比1Khz好像没提升。如果还想增加转速是不是只能增加电压?现在只是3.3的电压太小了。

不过现在总算是转起来了

图10 看这残影

以及总览图:

图11 电路总览图

完整代码:

#include
#include
#include
#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< 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< 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的详解与比较】



推荐阅读
  • 本文详细介绍了如何解决Uploadify插件在Internet Explorer(IE)9和10版本中遇到的点击失效及JQuery运行时错误问题。通过修改相关JavaScript代码,确保上传功能在不同浏览器环境中的一致性和稳定性。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文详细介绍了HTML中标签的使用方法和作用。通过具体示例,解释了如何利用标签为网页中的缩写和简称提供完整解释,并探讨了其在提高可读性和搜索引擎优化方面的优势。 ... [详细]
  • 本文介绍了如何在最新版本的Visual Studio Code中配置中文语言包,使用户能够更便捷地使用中文界面。文章详细描述了安装和配置步骤,并提供了相关补充说明。 ... [详细]
  • 在哈佛大学商学院举行的Cyberposium大会上,专家们深入探讨了开源软件的崛起及其对企业市场的影响。会议指出,开源软件不仅为企业提供了新的增长机会,还促进了软件质量的提升和创新。 ... [详细]
  • 新冠肺炎疫情期间,各大银行积极利用手机银行平台,满足客户在金融与生活多方面的需求。线上服务不仅激活了防疫相关的民生场景,还推动了银行通过互联网思维进行获客、引流与经营。本文探讨了银行在找房、买菜、打卡、教育等领域的创新举措。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 如何在PHPCMS V9中实现多站点功能并配置独立域名与动态URL
    本文介绍如何在PHPCMS V9中创建和管理多个站点,包括配置独立域名、设置动态URL,并确保各子站能够正常运行。我们将详细讲解从新建站点到最终配置路由的每一步骤。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 离线环境下的Python及其第三方库安装指南
    在项目开发中,有时会遇到电脑只能连接内网或完全无法联网的情况。本文将详细介绍如何在这种环境下安装Python及其所需的第三方库,确保开发工作的顺利进行。 ... [详细]
  • 掌握远程执行Linux脚本和命令的技巧
    本文将详细介绍如何利用Python的Paramiko库实现远程执行Linux脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ... [详细]
  • 本文将详细介绍在Windows 7环境下,检查U盘启动盘是否制作成功的多种方法,包括通过BIOS设置和使用模拟启动工具。 ... [详细]
  • 深入理解 H5C3 和 JavaScript 核心问题
    本文详细探讨了 H5C3 和 JavaScript 中的一些核心编程问题,通过实例解析和代码示例,帮助开发者更好地理解和应用这些技术。 ... [详细]
author-avatar
mobiledu2502929297
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有