- Цель: воспользоваться примером для отработки элементарных знаний по управлению двигателя по постоянному току.
Неплохо почитать теорию по ШИМ и ШИМ. можете кстати и сами поискать в просторах информационных.
Пример по шим есть и в espressif и многа.
Выше можно выбрать пример по ШИМ)).
Кнопка есть , движок припас. Чип добыл и драйвер взял.
И пример на раз нашли В чём подвох? Судьба кажи?
Так всё просто не бывает? Где облом нас ожидает?
Как его нам умаслить и удачу обрести?
- За основу берем перечень ресурсов :
- espressif [ПО] - на просторах интернета на раз два три находим
- hercules_3 [ПО]- на просторах интернета на раз два три находим
- esp32 s (в интернет магазине, но не микро, не мини, и платой с встроенным usb-uart и rezet , а не чип ). лучше как тут. одн в один для чистоты эксперимента
- ПК ddr3 8 /128 2.5Ггц. (5т<цена<10т ) tehnosell.ru
- кнопку взял из набора для ардуино на 31шт. , а набор для моделирования 45 сенсоров и модулей для Arduino / Ардуино тоже пойдет. можно просто как в описании взять резистор и кнопку. но правда там не понятно до конца как контачить кнопку и можно неопытному сжечь или всё или кое что.
Схемное решение и уже поправленное в кнопе там не оч и понятно было
ПРИМ если в поисковике набрать комплектующие для роботов и дронов, то много что нарыть можно.
Исходный код ниже и уже поправленный
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_attr.h"
#include "driver/mcpwm.h"
#include "soc/mcpwm_periph.h"
#define GPIO_PWM0A_OUT 15 //Set GPIO 15 as PWM0A
#define GPIO_PWM0B_OUT 16 //Set GPIO 16 as PWM0B
#define PUSH_BUTTON_PIN_SPEED 33
int buttonState = 0; int count_value =0; int prestate =0;
static void mcpwm_example_gpio_initialize(void)
{ printf("initializing mcpwm gpio...\n");
mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM0A, GPIO_PWM0A_OUT);
mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM0B, GPIO_PWM0B_OUT);
} /////////////////////////////
static void brushed_motor_forward(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num , float duty_cycle)
{ mcpwm_set_signal_low(mcpwm_num, timer_num, MCPWM_OPR_B);
mcpwm_set_duty(mcpwm_num, timer_num, MCPWM_OPR_A, duty_cycle);
mcpwm_set_duty_type(mcpwm_num, timer_num, MCPWM_OPR_A, MCPWM_DUTY_MODE_0); //call this each time, if operator was previously in low/high state
}//////////////////////////
static void brushed_motor_backward(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num , float duty_cycle)
{ mcpwm_set_signal_low(mcpwm_num, timer_num, MCPWM_OPR_A);
mcpwm_set_duty(mcpwm_num, timer_num, MCPWM_OPR_B, duty_cycle);
mcpwm_set_duty_type(mcpwm_num, timer_num, MCPWM_OPR_B, MCPWM_DUTY_MODE_0); //call this each time, if operator was previously in low/high state
}}//////////////////////////
static void brushed_motor_stop(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num)
{ mcpwm_set_signal_low(mcpwm_num, timer_num, MCPWM_OPR_A);
mcpwm_set_signal_low(mcpwm_num, timer_num, MCPWM_OPR_B);
}/////////////////////
static void mcpwm_example_brushed_motor_control(void *arg)
{ //1. mcpwm gpio initialization
mcpwm_example_gpio_initialize();
//2. initial mcpwm configuration
printf("Configuring Initial Parameters of mcpwm...\n");
mcpwm_config_t pwm_config;
pwm_config.frequency = 1000; //frequency = 500Hz,
pwm_config.cmpr_a = 0; //duty cycle of PWMxA = 0
pwm_config.cmpr_b = 0; //duty cycle of PWMxb = 0
pwm_config.counter_mode = MCPWM_UP_COUNTER;
pwm_config.duty_mode = MCPWM_DUTY_MODE_0;
mcpwm_init(MCPWM_UNIT_0, MCPWM_TIMER_0, &pwm_config); //Configure PWM0A & PWM0B with above settings
brushed_motor_forward(MCPWM_UNIT_0, MCPWM_TIMER_0, 20.0);
vTaskDelay(5000 / portTICK_PERIOD_MS);
brushed_motor_backward(MCPWM_UNIT_0, MCPWM_TIMER_0, 20.0);
vTaskDelay(5000 / portTICK_PERIOD_MS);
brushed_motor_stop(MCPWM_UNIT_0, MCPWM_TIMER_0);
vTaskDelay(2000 / portTICK_PERIOD_MS);
gpio_set_direction(PUSH_BUTTON_PIN_SPEED, GPIO_MODE_INPUT);
while(1){
buttonState = gpio_get_level(PUSH_BUTTON_PIN_SPEED);
if (buttonState == 1 && prestate == 0) {
count_value = count_value + 10;
float duty_cycle = count_value;
brushed_motor_forward(MCPWM_UNIT_0, MCPWM_TIMER_0, duty_cycle);
prestate = 1;
} else if(buttonState == 0) { prestate = 0;
brushed_motor_stop(MCPWM_UNIT_0, MCPWM_TIMER_0); }
vTaskDelay(500 / portTICK_PERIOD_MS);
}
}////////////////////////////////////////////
void app_main(void)
{ printf("Testing brushed motor...\n");
xTaskCreate(mcpwm_example_brushed_motor_control, "mcpwm_example_brushed_motor_control", 4096, NULL, 5, NULL);
}
при сборке схемы надо учитывать ниже код
#define GPIO_PWM0A_OUT 15 //Set GPIO 15 as PWM0A
#define GPIO_PWM0B_OUT 16 //Set GPIO 16 as PWM0B
#define PUSH_BUTTON_PIN_SPEED 33
который согласно схеме собираемой вами можно и нужно изменить.
- Как обычно выполняем пункты ниже
далее четыре операции (выше картинка)
- Создадим проект. Найдем файл main.c и вставим туда код. кто разбирается в коде может его поизучать , или в поисковике осмотреть что значит каждая строка кода....🙄 Дале смотрим операции ниже и выполняем.
Второй пункт надо выполнить, если проверена связь с МК. Как проверить ниже.
Четвертая операция на прошивку МК .
проверяем схему. подаём питание ! ДЫм не? Баба не? Жмём на кноку.
собранна Может визжать? Смотрим как всё жужит - это двигатель старается.
ну на время не ставил - на прогон . У меня пищать начало до начала нажатия кнопки. резко нажал и прошло.
в общем понял так , что движки у меня не те или блок питания не тот по схеме . У меня 5-12В , а надо 3-6 вольт. Там в примере видеоролик посмотрите - там прям видно , что движок для дронов. Придётся покупать , другие движки.
Результат: плачевный .много времени потратил. за двигателя не понятно . в общем до разбираться надо.
Есть информация по САПР ТП - это тем кто не устал.
Кто устал в поисковике, на берите в промежутках между жизнью почитать.😋
спонсор ООО АК ПРАВОВОЕ СОТРУДНИЧЕСТВО.
лайки ставить если не жаль красным тапочкам, ну и исполнительнице.👍