Управление сервоприводом (сервомашинкой) с помощью микроконтроллера ATMega.
Сервомашинки или сервоприводы нашли широкое применение не только в роботостроении, моделизме, но и в различных отраслях промышленности и приборостроении.
Как устроена сервомашинка
Большинство сервоприводов используют три провода для работы. Провод для питания, обычно 4.8В или 6В, общий провод (земля) и сигнальный провод. Управляющий сигнал передает информацию о требуемом положении выходного вала. Вал связан с потенциометром, который определяет его положение. Контроллер в сервоприводе по сопротивлению потенциометра и значению управляющего сигнала определяет, в какую сторону требуется вращать мотор, чтобы получить нужное положение выходного вала. Чем выше напряжение питания сервопривода, тем быстрее он работает и больший момент развивает.Характеристики сервоприводов
Размер и весРазмеры бывают: "микро", "мини", "стандартный" и "гигант". В пределах каждого класса размеры могут немного меняться. Средние размеры сервоприводов для справки:
- Микро: 24мм x 12мм x 24мм, вес: 5-10 г.
- Мини: 30мм x 15мм x 35мм, вес 25 г.
- Стандарт: 40мм x 20мм x 37мм, вес: 50-60 г.
Скорость
Скорость сервоприводов измеряется временем поворота качалки сервопривода на угол 60 градусов при напряжении питания 4.8В и 6В. Например, сервопривод с параметром 0.22с/60° при 4.8В поворачивает вал на 60 градусов за 0.22с при напряжении питания 4.8В. Это не так быстро, как может показаться. Наиболее быстрые сервоприводы имеют время перемещения от 0.06 до 0.09с.
Угол поворота
Сервоприводы могут иметь угол поворота вала 60, 90, 180 градусов. Угол поворота ограничивается электроникой и механически. Существуют сервоприводы без ограничения, т.е. вращающиеся на 360 градусов. Если у Вас имеется сервопривод с рабочим диапазоном 60 градусов, то расширить его можно только изменив конструкцию сервомашинки. Иногда можно увеличить диапазон специальным образом исказив управляющий сигнал. Но это нестандартный и ненадежный способ.
Момент на валу
Момент сервопривода измеряется по весу груза в кг, который сервопривод может удерживать неподвижно на качалке с плечом 1 см. Указывают две цифры, для напряжения питания 4.8В и 6В. Например, если указано, что сервопривод развивает 10кг/см, значит, что на качалке длиной 1см сервопривод может развить усилие 10 кг, прежде чем остановится. Для качалки в 2см такой сервопривод сможет развить усилие 5кг, а на 5мм 20кг.
Цифровые и аналоговые сервоприводы
Цифровые и аналоговые сервоприводы механически не отличаются друг от друга. У них те же корпуса, моторы, шестеренки и даже потенциометры. Все дело в способе управления мотором. Цифровые сервоприводы более точны и, как правило, имеют меньшее время реакции. Но они потребляют больше энергии, чем аналоговые сервоприводы. Управляющий сигнал для аналоговых и цифровых сервоприводов одинаков.
Управляющий сигнал
Управляющий сигнал представляет собой импульсы переменной ширины. Импульсы повторяются с постоянной частотой (как правило, с частотой 50Гц). Положение сервопривода определяется шириной импульса. Для типичного сервопривода, используемого в радиоуправляемых моделях, длительность импульса в 1500 мкс означает, что сервопривод должен занять среднее положение. Увеличение или уменьшение длины импульса заставит сервопривод повернуться по часовой или против часовой стрелки, соответственно.
Таким образом, для управления сервоприводом нам потребуется формировать ШИМ с частотой 50 герц. При этом для положения "0" длительность импульса должна составлять 1000 микросекунд, а для положения "максимум" - 2000 микросекунды. Среднее положение - 1500 микросекунд.
Схема сервотестера
Финалом наших изысканий будет плата сервотестера, работающая с двумя сервоприводами. Светодиоды отображают режим сервотестера. Формировать ШИМ будем использовать аппаратные возможности микроконтроллера ATMega8, а задающий сигнал будем формировать с учетом положения потенциометра. Управляющие сигналы для сервоприводов формируются на ногах OC1A, OC1B. Режимы переключаются кнопкой. Три светодиода отображают режим работы сервотестера.
- Режим 1 - положение сервомашинок задается потенциометром
- Режим 2 - задается среднее положение сервоприводов
- Режим 3 - задающий сигнал циклически изменяется от одного крайнего положения к другому.
Печатная плата
Файл печатной платы в формате lay можно скачать в конце статьи. Скачать плату, прошивку, исходный код
Исходный код
#include <stdio.h>
#include <avr/io.h>
#include <util/delay.h>
//=================================== АЦП ==================================
//Инициализация АЦП:
void adc_init(void){
ADCSRA = _BV(ADEN) | _BV(ADPS0) | _BV(ADPS1) | _BV(ADPS2); // prescaler = 128
}
//Чтение канала АЦП:
uint32_t adc_read(uint8_t ch){
ADMUX = _BV(REFS0) | (ch & 0x1F); // set channel (VREF = VCC)
ADCSRA &= ~_BV(ADIF); // clear hardware "conversion complete" flag
ADCSRA |= _BV(ADSC); // start conversion
while(ADCSRA & _BV(ADSC)); // wait until conversion complete
return ADC; // read ADC (full 10 bits);
}
int main() {
char mode=0; // Режим - по умолчанию 0
int direct=0;
uint16_t adc_result;
#define ICR_MAX F_CPU/50 // ICR1(TOP) = fclk/(N*f) ; N-Делитель; f-Частота; 1000000/1/50 = 20000
#define OCR_MIN ICR_MAX/20
#define OCR_MAX ICR_MAX/10
#define OCR_CENTER (ICR_MAX/4/10)*3
// На порту кнопки включаем подтягивающий резистор
DDRB &= ~(1<<4);
PORTB |= (1<<4);
// Настраиваем порт светодиодов
DDRC = (1<<1) | (1<<2) | (1<<3);
PORTC |= (1<<(mode+1));
// Настраиваем PWM на таймере 1 (выход на ногах PB1, PB2)
TCCR1A = 0; // Отключаем PWM пока будем конфигурировать
ICR1 = ICR_MAX; // Частота всегда 50 Гц
// Включаем Fast PWM mode via ICR1 на Таймере 1 без делителя частоты
TCCR1A = (1<<WGM11);
TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS10);
// Устанавливае PB1 и PB2 как выход
DDRB |= (1<<1) | (1<<2);
// Включаем PWM на port B1 и B2
TCCR1A |= (1<<COM1A1) | (1<<COM1B1);
// Включаем АЦП
adc_init();
while(1){
// Если кнопка нажата (Переключение режимов)
if ((PINB & (1<<4)) == 0)
{
// Ждем пока кнопку отпустят
while ((PINB & (1<<4)) == 0) {
_delay_ms(200);
}
mode++;
if (mode > 2) {
mode = 0;
}
// Включаем нужный светодиод
PORTC &= ~((1<<1) | (1<<2) | (1<<3));
PORTC |= (1<<(mode+1));
}
switch (mode){
case 0:{
// Задаем положени сервомеханизма, в зависимости от положения потенциометра adc_result
adc_result=adc_read(0);
OCR1A = OCR_MIN+(adc_result * (OCR_MAX-OCR_MIN)/1024);
OCR1B = OCR1A;
break;
}
case 1:{
// Задаем центральное положение сервомеханизма
direct=0;
OCR1A = OCR_CENTER;
OCR1B = OCR1A;
break;
}
case 2:{
// Циклическое изменение положения сервомашинки
if (direct==0){
OCR1A++;
OCR1B++;
if (OCR1A >= OCR_MAX) {
direct=1;
}
}
if (direct==1){
OCR1A--;
OCR1B--;
if (OCR1A <= OCR_MIN) {
direct=0;
}
}
_delay_ms(1);
break;
}
}
}
}
Скачать плату, прошивку, исходный код
Успехов!
Читайте также: Raspberry Pi — ШИМ и Сервопривод
И ни слова о фьюзах...
Фьюзы менять не надо, все в стандартном, заводском состоянии.
Доброго времени суток, повторил данное устройство, заработало сразу без проблем но вот только сервы не доходят до конечных точек. можно ли поправить прошивку например от 0,8 до 2,3мс и частотой 50Гц?
Хотелось бы схему самого сервопривода. Как он устроен. Из DC мотора и эл. схемы. Где взяц схему?
Недавні записи
- Text to speech. Українська мова
- LCD Display ST7567S (IIC)
- Розпізнавання мови (Speech recognition)
- Selenium
- Комп'ютерний зір (Computer Vision)
- Деякі думки про точність вимірювань в електроприводі
- Датчики Холла 120/60 градусів
- Модуль драйверів напівмосту IGBT транзисторів
- Драйвер IGBT транзисторів на A316J
- AS5600. Варіант встановлення на BLDC мотор
Tags
docker sensors rtc led timer wifi remap sms css websocket mongodb bme280 rfid bluetooth esp8266 nodemcu bkp piezo bmp280 i2c mpu-6050 encoder examples avr brushless ngnix nvic displays bldc java-script pmsm barometer pwm lcd ethernet stm32 raspberry-pi capture usart gpio exti atmega meteo solar smd dma adc eeprom eb-500 flask python ssd1306 uart options flash mpx4115a html gps st-link 3d-printer servo dc-dc foc git books battery hih-4000 watchdog dht11 web tim programmator ssd1331 mpu-9250 usb rs-232 motor max1674 soldering
Архіви