基于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-使用有刷直流电机笔记的更多相关文章

  1. 《Data Structures and Algorithm Analysis in C》学习与刷题笔记

    <Data Structures and Algorithm Analysis in C>学习与刷题笔记 为什么要学习DSAAC? 某个月黑风高的夜晚,下班的我走在黯淡无光.冷清无人的冲之 ...

  2. Python 刷题笔记

    Python 刷题笔记 本文记录了我在使用python刷题的时候遇到的知识点. 目录 Python 刷题笔记 选择.填空题 基本输入输出 sys.stdin 与input 运行脚本时传入参数 Pyth ...

  3. PTA刷题笔记

    PTA刷题记录 仓库地址: https://github.com/Haorical/Code/tree/master/PTA/GPLT 两周之内刷完GPLT L2和L3的题,持续更新,包括AK代码,坑 ...

  4. PAT-甲级刷题笔记和总结

     本帖主要记录一些自己在刷题过程中的一些笔记,包括: 1.常用的函数 2.STL中常用方法 3.常见错误 4.其他常用方法 5.刷题过程中的常见算法:https://www.cnblogs.com/M ...

  5. 《剑指offer》刷题笔记

    简介 此笔记为我在 leetcode 上的<剑指offer>专题刷题时的笔记整理. 在刷题时我尝试了 leetcode 上热门题解中的多种方法,这些不同方法的实现都列在了笔记中. leet ...

  6. Sony Z1 flashtool 刷机笔记

    第一次硬刷,(相较于recovery的卡刷)差点变成无限重启..记录一些关键步骤: 1 unlock bootloader http://developer.sonymobile.com/unlock ...

  7. Ye.云狐J2刷机笔记 | 完美切换内部存储卡和SD卡的改法.vold.fstab

    ================================================================================Ye.完美切换内部存储卡和SD卡成功.v ...

  8. 18.9.10 LeetCode刷题笔记

    本人算法还是比较菜的,因此大部分在刷基础题,高手勿喷 选择Python进行刷题,因为坑少,所以不太想用CPP: 1.买股票的最佳时期2 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. ...

  9. K2路由器刷机笔记

    临近双11,K2路由器广告加的越来越放肆,实在太难忍受就刷了个固件.这里把路由器刷机的一般流程记录一下. 一.开启telnet 刷固件,首先要取得路由器系统的控制权,这样我们才能自由的进行操作. 方法 ...

随机推荐

  1. redux 源码浅析

    redux 源码浅析 redux 版本号: "redux": "4.0.5" redux 作为一个十分常用的状态容器库, 大家都应该见识过, 他很小巧, 只有 ...

  2. 如何实现一个简易版的 Spring - 如何实现 AOP(下)

    前言 前面两篇 如何实现 AOP(上).如何实现 AOP(中) 做了一些 AOP 的核心基础知识简要介绍,本文进入到了实战环节了,去实现一个基于 XML 配置的简易版 AOP,虽然是简易版的但是麻雀虽 ...

  3. Go语言中的单例模式

    Go语言中的单例模式 在过去的几年中,Go语言的发展是惊人的,并且吸引了很多由其他语言(Python.PHP.Ruby)转向Go语言的跨语言学习者. Go语言太容易实现并发了,以至于它在很多地方被不正 ...

  4. VS Code 调试 OneFlow

    VS Code 调试 OneFlow 本文介绍如何配置 VS Code,搭建 OneFlow 的 GUI 开发环境. 如果对于 VS Code 及其插件系统还不熟悉,可以参阅官方文档. 本文包括: 如 ...

  5. CUDA 8的混合精度编程

    CUDA 8的混合精度编程 Volta和Turing GPU包含 Tensor Cores,可加速某些类型的FP16矩阵数学运算.这样可以在流行的AI框架内更快,更轻松地进行混合精度计算.要使用Ten ...

  6. 使用Keil语言的嵌入式C编程教程(上)

    使用Keil语言的嵌入式C编程教程(上) Embedded C Programming Tutorial with Keil Language Embedded System 嵌入式系统是指以单片机为 ...

  7. Mybatis映射文件中的参数传递

    一.接口中只有一个参数 1.参数是基本类型or基本类型的包装类or字符串类型 这种情况下映射文件中#{}里的内容可以是任意的,你可以使用#{xxx} 或 #{abc} .....因为此时#{}相当于一 ...

  8. javascript中的设计模式

    什么是设计模式 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结. 使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性. ...

  9. 从零开始学架构(三)UML建模

    文章大纲 1.  文章介绍 2.  UML概述 3.  静态模型 4.  动态模型 5.  UML建模的一般过程 一.文章介绍 1.1为什么学习UML (1)UML是一种软件架构的模型表现方法,用于项 ...

  10. Linkerd 2.10(Step by Step)—多集群通信

    Linkerd 2.10 系列 快速上手 Linkerd v2.10 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traef ...