Эксперименты по управлению электро-двигателем

Joiner
Offline
Зарегистрирован: 04.09.2014

Решил тему создать здесь, т.к. не определил куда она больше относится, к программированию или к аппаратным вопросам.

Решил сделать регулятор оборотов двигателя с обратной связью, и чтобы не наломать дров, решил делать частями, обкатывая каждую часть проекта.

Кто-то скажет - " Тема про регулятор уже есть!!!!!".  Да, согласен. Но там уровень разработок гораздо выше, а я как не опытный в этих делах новичок буду идти неторопливо, мелкими шагами, и постараюсь дойти до конечного результата, победного или провального.

Сейчас уже попробовал шим регулятор оборотов двигателя и собрал макет тахометра с щелевым опртодатчиком. Если с ШИМ регулировкой пока все ясно, то с тахометром пока есть вопросы.

Если кому интересно, вот ссылка на видео, где сравнивается ШИМ 8бит и ШИМ 10 бит

https://www.youtube.com/watch?v=AsB2yE233BA&feature=youtu.be

 

Joiner
Offline
Зарегистрирован: 04.09.2014

Всвязи с тем, что тема вызвала огромный интерес :), решил добавить коротенькое видео про тахометр на Ардуинке. Тахометр потом вольется в регулятор оборотов двигателя и будет с ним одним устройством. Вот ссылочка

https://www.youtube.com/watch?v=tYvchahLkTU&feature=youtu.be

Вывод от этого опыта - Этот оптический датчик получается несколько громоздким. Будем думать как и что применить. Есть варианты - датчик холла и оптический ИК датчик на отражение......

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

А ссылки? На шилд на нокиа и т.д. - хотелось бы жеж

А по ШИМ, на ардуино можно сделать и 16 битный, DIMAX публиковал код, я исследую 10 битный, код не меняется практически

/* Вызываем для изменения скважности) */
void analogWrite16(uint16_t value) { OCR1A = value;}

 /* Вызываем в setup() */
void setup16bitPWM () {
   pinMode(9,OUTPUT);
   TCCR1A=(1<<COM1A1)|(1<<COM1A0)|(1<<WGM11);
   TCCR1B=(1<<WGM13)|(1<<WGM12)|(1<<CS10); //mode14 FastPwm
   ICR1=1023; // счётчик для 10 бит, для 16 бит - 65535
   OCR1A=512; //50% default value
}

void setup() {
 Serial.begin(9600);
 analogReference(INTERNAL);
 setup16bitPWM();

 

Joiner
Offline
Зарегистрирован: 04.09.2014

ua6em пишет:

А ссылки? На шилд на нокиа и т.д. - хотелось бы жеж

А по ШИМ, на ардуино можно сделать и 16 битный, DIMAX публиковал код, я исследую 10 битный, код не меняется практически

..........

Сдается мне, что насчет битности шим я немного погорячился. Думаю, не битности ШИМ надо добиваться, а увеличения частоты импульсов.

Вот ссылка на Nokia-шилд, но уже следующей версии http://www.ebay.com/itm/LCD4884-Joystick-Shield-v2-0-4884-LCD-Expansion-Board-For-Arduino-Raspberrypi-M-/172213448897?hash=item2818b8b0c1:g:XSgAAOSwuR5XPvxQ

Где-то уже писал о достоинствах и недостатках (по моему скромному мнению), сейчас повторю

Достоинства: 

1. Компактная красивая компановка;

2. На борту имеется подключенный дисплей, джойстик-аналог аналоговой клавиатуры;

3. Около каждого, выведенного на шилд цифрового и аналогового пина имеется дополнительно GND и VCC

 

Недостатки:

1. Дисплей жестко висит на пинах 2,3,4,5,6 (мне не удалось использовать пины 2 и 3 для внешних прерываний)

2. Пины выведены штырьками вертикально вокруг дисплея, и дисплей загромождается кучей проводов.

 

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Битность ШИМ это и есть частота, если при 16 битах частота равна 244Гц, то при

10 битах (244*65536/1024)
11 битах (244*65536/2048)
12 битах (244*65536/4096)
13 битах (244*65536/8192)
14 битах (244*65536/16384)
15 битах (244*65536/32768)

 

Joiner
Offline
Зарегистрирован: 04.09.2014

ua6em пишет:

Битность ШИМ это и есть частота, если при 16 битах частота равна 244Гц, то при

10 битах (244*65536/1024)
11 битах (244*65536/2048)
12 битах (244*65536/4096)
13 битах (244*65536/8192)
14 битах (244*65536/16384)
15 битах (244*65536/32768)

 

Если честно, то ни чего не понял. Что означают циферки в формулах?

На Ардуинке заявлен 8-ми битный ШИМ. Я считал что это значения от 0 до 255, т.е. 255 градаций скважности. А 10 бит это значения от 0 до 1023.

На Ардуинке частота ШИМ примерно 490 герц, на транзистортестере, который тоже на Атмеге 328, заявлен 10-ти битный шим. На транзистортестере частота ШИМ 7800 герц.

Как эти значения связаны с вашими формулами? Извините, но до меня не дошло :(

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Пост #2 - это код ШИМ на таймерах, ШИМ от 8 бит до 16, там в коде есть пояснение, выход ШИМ на 9 пин )))
Слона то я и не приметил )))

Joiner
Offline
Зарегистрирован: 04.09.2014

ua6em пишет:

Пост #2 - это код ШИМ на таймерах, ШИМ от 8 бит до 16, там в коде есть пояснение, выход ШИМ на 9 пин )))
Слона то я и не приметил )))

Спасибо, попробую разобраться. Попробую запустить на ардуинке.

P.S. Попробовал, запустил, РАБОТАЕТ! Измерил тестером частоту на пин 9, она 15.6 килогерц. Вечерком подключу осцилограф, посмотрю, попробую скважность менять.

Спасибо dimax_у и ua6em_у

Arhat109-2
Offline
Зарегистрирован: 24.09.2015
TCCR1B=(1<<WGM13)|(1<<WGM12)|(1<<CS10); //mode14 FastPwm

Поправьте коммент, плиз. Ибо тут выставляется не только режим fastPwm, но ещё и задается предделитель для частоты счета таймера. Управляя предделителем можно получать разные частоты ШИМ, вплоть до 30Гц для 8-битного таймера... Частота 490гц получается для предделителя в 1/64 - типового для 16Мгц тактовой и нормальной работы millis().

Только и всего.

P.S. Да и ШИМ можно получать и иными режимами работы таймера. В частности для 16-и битного таймера очень удобен 14-й режим fastPWM with ICP register. Задавая правильный предделитель и ограничение счета в регистре ICP, очень удобно управлять серводвигателями через аппаратный ШИМ, например так:

// v.1 set 16bit timer (only t:[1,3,4,5]) to PWM special for servo motors:
//     1/64 FAST-pwm mode with ICP, 50hz (20msec) and set to pwmOut PWM pin,
// Установка 16битного таймера и его каналов в типовой ШИМ для серво моторов. Ноги на вывод устанавливать отдельно!
//
// @example: set timer5 to pwmServo and use 2 servo at pins 44,46:
//   timerSetServo(5, pwmPinMode(44, PWM_NORMAL)|pwmPinMode(46, PWM_NORMAL))
//   ** set pins 44,46 to OUTPUT manually!
#define timerSetServo(t,pwmPinMask)                               \
{                                                                 \
  timerControl(t, A) = (1<<WGM11)|(pwmPinMask);                   \
  timerControl(t, B) = (1<<WGM13)|(1<<WGM12)|(1<<CS11)|(1<<CS10); \
  timerCapture(t) = 4999;                                         \
}

// v.2: set to servoMode too for one servo drive by PWM pin number p:[2,3,5,6,7,8,11,12,44,45,46,T1C]
//      Установка одной ноги на ШИМ и её таймера в типовой режим сервоШИМа: 50Гц.
// Для последующего канала этого же таймера достаточно вызвать pwmSet(p).
//
// example set 45 pin to use servo (only one for timer!): pwmSetServo(45);
//     set pin to OUTPUT manually! Ногу на вывод - самостоятельно!
#define pwmSetServo(p1)                                                         \
{                                                                               \
  timerControl(pwmGetTimer(p1), A) = (1<<WGM11)|(pwmPinMode(p1, PWM_NORMAL));   \
  timerControl(pwmGetTimer(p1), B) = (1<<WGM13)|(1<<WGM12)|(1<<CS11)|(1<<CS10); \
  timerCapture(pwmGetTimer(p1)) = 4999;                                         \
}

 

Joiner
Offline
Зарегистрирован: 04.09.2014

Arhat109-2 пишет:

TCCR1B=(1<<WGM13)|(1<<WGM12)|(1<<CS10); //mode14 FastPwm

Поправьте коммент, плиз. Ибо тут выставляется не только режим fastPwm, но ещё и задается предделитель для частоты счета таймера. Управляя предделителем можно получать разные частоты ШИМ, вплоть до 30Гц для 8-битного таймера... Частота 490гц получается для предделителя в 1/64 - типового для 16Мгц тактовой и нормальной работы millis().

Только и всего.

P.S. Да и ШИМ можно получать и иными режимами работы таймера. В частности для 16-и битного таймера очень удобен 14-й режим fastPWM with ICP register. Задавая правильный предделитель и ограничение счета в регистре ICP, очень удобно управлять серводвигателями через аппаратный ШИМ, например так:.................................

Arhat1090-2, спасибо. Понял, что мне еще разбираться и разбираться. Но я постараюсь :)

Joiner
Offline
Зарегистрирован: 04.09.2014

Нашел в инете статейку по ШИМ Ардуино. Там рассказано как изменить частоту ШИМ, и есть табличка для выбора частоты. Попробовал, работает. Скетчик очень простой (в конце статьи)

Может кому интересно, вот ссылочка http://mypractic.ru/urok-37-shirotno-impulsnaya-modulyaciya-v-arduino.html

Самое интересное в конце статьи (скетч и таблица). Из таблицы следует, что я правильно понимал что такое битность ШИМ и что такое частота. В таблице на первой позиции 8-ми битный шим с частотой 62.5 килогерц.

P.S. Решил блок с мосфетом и двигателем гальванически развязать с микроконтроллером. Вроде говно вопрос, ставим оптрон. Иду в ПДФчик "Базовое подключение устройств к Ардуино", нахожу как подключается оптрон (оптрон нарисован точно такой же 4N25 как и у меня), подключаю, испытываю. ШИМ на частоте 490 герц работает, на частоте 7800 - нет! Не сразу понял, что виноват оптрон. Начал разбираться....оптрон, вроде бы килогерц 300 уж должен пропустить! Оказывается не так все просто. Пока немножко завяз на этой стадии. Ребята с другого форума кое-что подсказали. Результаты обнадеживающие. По прохождении этого этапчика отпишу.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Joiner пишет:

 По прохождении этого этапчика отпишу.

Этап не пройден?

Joiner
Offline
Зарегистрирован: 04.09.2014

ua6em пишет:

Joiner пишет:

 По прохождении этого этапчика отпишу.

Этап не пройден?

Этап пройден. Плата спаяна, испытана на разных частотах. Выводы сделаны. Применение не найдено. Интерес потерян :)

Более интересными показались темы вроде "Регулятор оборотов двигателя с обратной связью."