ESP32-使用有刷直流电机笔记
基于ESP-IDF4.1
1 /*
2 * 刷直流电动机控制示例,代码通过L298电机芯片测试
3 */
4
5 #include <stdio.h>
6
7 #include "freertos/FreeRTOS.h"
8 #include "freertos/task.h"
9 #include "esp_attr.h"
10
11 #include "driver/mcpwm.h"
12 #include "soc/mcpwm_periph.h"
13
14 #define GPIO_PWM0A_OUT 15 //设置 GPIO 15 作为 PWM0A
15 #define GPIO_PWM0B_OUT 16 //设置 GPIO 16 作为 PWM0B
16
17 static void mcpwm_example_gpio_initialize(void)
18 {
19 printf("initializing mcpwm gpio...\n");
20 mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM0A, GPIO_PWM0A_OUT);
21 mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM0B, GPIO_PWM0B_OUT);
22 }
23
24 /**
25 * @brief 电机向前移动
26 */
27 static void brushed_motor_forward(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num , float duty_cycle)
28 {
29 mcpwm_set_signal_low(mcpwm_num, timer_num, MCPWM_OPR_B);
30 mcpwm_set_duty(mcpwm_num, timer_num, MCPWM_OPR_A, duty_cycle);
31 mcpwm_set_duty_type(mcpwm_num, timer_num, MCPWM_OPR_A, MCPWM_DUTY_MODE_0);
32 }
33
34 /**
35 * @brief 电机向后移动
36 */
37 static void brushed_motor_backward(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num , float duty_cycle)
38 {
39 mcpwm_set_signal_low(mcpwm_num, timer_num, MCPWM_OPR_A);
40 mcpwm_set_duty(mcpwm_num, timer_num, MCPWM_OPR_B, duty_cycle);
41 mcpwm_set_duty_type(mcpwm_num, timer_num, MCPWM_OPR_B, MCPWM_DUTY_MODE_0);
42 }
43
44 /**
45 * @brief 电机停止
46 */
47 static void brushed_motor_stop(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num)
48 {
49 mcpwm_set_signal_low(mcpwm_num, timer_num, MCPWM_OPR_A);
50 mcpwm_set_signal_low(mcpwm_num, timer_num, MCPWM_OPR_B);
51 }
52
53 /**
54 * @brief 为有刷直流电机配置MCPWM
55 */
56 static void mcpwm_example_brushed_motor_control(void *arg)
57 {
58 //1. mcpwm gpio 初始化
59 mcpwm_example_gpio_initialize();
60
61 //2. 初始化 mcpwm 配置
62 printf("Configuring Initial Parameters of mcpwm...\n");
63 mcpwm_config_t pwm_config;
64 pwm_config.frequency = 1000; //频率 = 500Hz,
65 pwm_config.cmpr_a = 0; // PWMxA占空比 = 0
66 pwm_config.cmpr_b = 0; // PWMxb占空比 = 0
67 pwm_config.counter_mode = MCPWM_UP_COUNTER;
68 pwm_config.duty_mode = MCPWM_DUTY_MODE_0;
69 mcpwm_init(MCPWM_UNIT_0, MCPWM_TIMER_0, &pwm_config);
70 while (1) {
71 brushed_motor_forward(MCPWM_UNIT_0, MCPWM_TIMER_0, 50.0);
72 vTaskDelay(2000 / portTICK_RATE_MS);
73 brushed_motor_backward(MCPWM_UNIT_0, MCPWM_TIMER_0, 30.0);
74 vTaskDelay(2000 / portTICK_RATE_MS);
75 brushed_motor_stop(MCPWM_UNIT_0, MCPWM_TIMER_0);
76 vTaskDelay(2000 / portTICK_RATE_MS);
77 }
78 }
79
80 void app_main(void)
81 {
82 printf("Testing brushed motor...\n");
83 xTaskCreate(mcpwm_example_brushed_motor_control, "mcpwm_examlpe_brushed_motor_control", 4096, NULL, 5, NULL);
84 }
原文:https://gitee.com/EspressifSystems/esp-idf/tree/master/examples/peripherals/mcpwm/mcpwm_brushed_dc_control
ESP32-使用有刷直流电机笔记的更多相关文章
- 《Data Structures and Algorithm Analysis in C》学习与刷题笔记
<Data Structures and Algorithm Analysis in C>学习与刷题笔记 为什么要学习DSAAC? 某个月黑风高的夜晚,下班的我走在黯淡无光.冷清无人的冲之 ...
- Python 刷题笔记
Python 刷题笔记 本文记录了我在使用python刷题的时候遇到的知识点. 目录 Python 刷题笔记 选择.填空题 基本输入输出 sys.stdin 与input 运行脚本时传入参数 Pyth ...
- PTA刷题笔记
PTA刷题记录 仓库地址: https://github.com/Haorical/Code/tree/master/PTA/GPLT 两周之内刷完GPLT L2和L3的题,持续更新,包括AK代码,坑 ...
- PAT-甲级刷题笔记和总结
本帖主要记录一些自己在刷题过程中的一些笔记,包括: 1.常用的函数 2.STL中常用方法 3.常见错误 4.其他常用方法 5.刷题过程中的常见算法:https://www.cnblogs.com/M ...
- 《剑指offer》刷题笔记
简介 此笔记为我在 leetcode 上的<剑指offer>专题刷题时的笔记整理. 在刷题时我尝试了 leetcode 上热门题解中的多种方法,这些不同方法的实现都列在了笔记中. leet ...
- Sony Z1 flashtool 刷机笔记
第一次硬刷,(相较于recovery的卡刷)差点变成无限重启..记录一些关键步骤: 1 unlock bootloader http://developer.sonymobile.com/unlock ...
- Ye.云狐J2刷机笔记 | 完美切换内部存储卡和SD卡的改法.vold.fstab
================================================================================Ye.完美切换内部存储卡和SD卡成功.v ...
- 18.9.10 LeetCode刷题笔记
本人算法还是比较菜的,因此大部分在刷基础题,高手勿喷 选择Python进行刷题,因为坑少,所以不太想用CPP: 1.买股票的最佳时期2 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. ...
- K2路由器刷机笔记
临近双11,K2路由器广告加的越来越放肆,实在太难忍受就刷了个固件.这里把路由器刷机的一般流程记录一下. 一.开启telnet 刷固件,首先要取得路由器系统的控制权,这样我们才能自由的进行操作. 方法 ...
随机推荐
- redux 源码浅析
redux 源码浅析 redux 版本号: "redux": "4.0.5" redux 作为一个十分常用的状态容器库, 大家都应该见识过, 他很小巧, 只有 ...
- 如何实现一个简易版的 Spring - 如何实现 AOP(下)
前言 前面两篇 如何实现 AOP(上).如何实现 AOP(中) 做了一些 AOP 的核心基础知识简要介绍,本文进入到了实战环节了,去实现一个基于 XML 配置的简易版 AOP,虽然是简易版的但是麻雀虽 ...
- Go语言中的单例模式
Go语言中的单例模式 在过去的几年中,Go语言的发展是惊人的,并且吸引了很多由其他语言(Python.PHP.Ruby)转向Go语言的跨语言学习者. Go语言太容易实现并发了,以至于它在很多地方被不正 ...
- VS Code 调试 OneFlow
VS Code 调试 OneFlow 本文介绍如何配置 VS Code,搭建 OneFlow 的 GUI 开发环境. 如果对于 VS Code 及其插件系统还不熟悉,可以参阅官方文档. 本文包括: 如 ...
- CUDA 8的混合精度编程
CUDA 8的混合精度编程 Volta和Turing GPU包含 Tensor Cores,可加速某些类型的FP16矩阵数学运算.这样可以在流行的AI框架内更快,更轻松地进行混合精度计算.要使用Ten ...
- 使用Keil语言的嵌入式C编程教程(上)
使用Keil语言的嵌入式C编程教程(上) Embedded C Programming Tutorial with Keil Language Embedded System 嵌入式系统是指以单片机为 ...
- Mybatis映射文件中的参数传递
一.接口中只有一个参数 1.参数是基本类型or基本类型的包装类or字符串类型 这种情况下映射文件中#{}里的内容可以是任意的,你可以使用#{xxx} 或 #{abc} .....因为此时#{}相当于一 ...
- javascript中的设计模式
什么是设计模式 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结. 使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性. ...
- 从零开始学架构(三)UML建模
文章大纲 1. 文章介绍 2. UML概述 3. 静态模型 4. 动态模型 5. UML建模的一般过程 一.文章介绍 1.1为什么学习UML (1)UML是一种软件架构的模型表现方法,用于项 ...
- Linkerd 2.10(Step by Step)—多集群通信
Linkerd 2.10 系列 快速上手 Linkerd v2.10 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traef ...