Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.04.2013, 21:56   #1
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Управление шаговым двигателем 28BYJ-48

Управление шаговым двигателем 28BYJ-48
Попался мне в руки Шаговый двигатель 28BYJ-48 решил его использовать для управления жалюзи на кухне.
Шаговый двигатель 28BYJ-48, использует в кондиционерах, термовентиляторах и т.п.
Он как правило продается с простейшим драйвером собранном на микросхеме ULN2003
На плате есть 4 светодиода отображающие на какой из обмоток есть напряжение
Название: 28byj.jpg
Просмотров: 9144

Размер: 27.2 Кб
Характеристики:
номинальное напряжение питания: 5В или 12В
число фаз: 4
сопротивление фазы: 200 Ом ±7%
угловой шаг: 5,625°
соотношение: 1:64
частота: 100 Гц
крутящий момент: 450 г*см
сопротивление изоляции: >10 МОм (500В)
диаметр: 25 мм высота 18мм.
плата управления: 27 х 17 мм.
общий вес: до 80 гр.

Схема
Название: 28BYJ-48_wiring.jpg
Просмотров: 8155

Размер: 7.6 Кб

Со встроенной библиотекой Stepper Library, моторчик отказался работать
Написал тестовый скетч для ардуино, что бы заставить его вращаться
В полношаговом режиме
PHP код:
#include <CyberLib.h>
#define dur 4 //от 10 до 3 
#define step_init {D2_Out; D3_Out; D4_Out; D5_Out;} //сконфигурируем на выход
#define step_stop {D2_Low; D3_Low; D4_Low; D5_Low; delay_ms(dur); }

#define step1 {D2_High; D3_High; D4_Low; D5_Low; delay_ms(dur);}
#define step2 {D2_Low; D3_High; D4_High; D5_Low; delay_ms(dur);}
#define step3 {D2_Low; D3_Low; D4_High; D5_High; delay_ms(dur);}
#define step4 {D2_High; D3_Low; D4_Low; D5_High; delay_ms(dur);}

void setup() 
{
  
step_init;
  
step_stop;
}

void loop()
Start

    step1
;
    
step2;
    
step3;
    
step4;
  
End 
Полушаговый режим
PHP код:
#include <CyberLib.h>
#define dur 4 //от 10 до 3 изменяется скорость вращения
#define step_init {D2_Out; D3_Out; D4_Out; D5_Out;} //сконфигурируем на выход
#define step_stop {D2_Low; D3_Low; D4_Low; D5_Low; delay_ms(dur); }

#define step1 {D2_High; D3_Low; D4_Low; D5_Low; delay_ms(dur);}
#define step2 {D2_High; D3_High; D4_Low; D5_Low; delay_ms(dur);}
#define step3 {D2_Low; D3_High; D4_Low; D5_Low; delay_ms(dur);}
#define step4 {D2_Low; D3_High; D4_High; D5_Low; delay_ms(dur);}
#define step5 {D2_Low; D3_Low; D4_High; D5_Low; delay_ms(dur);}
#define step6 {D2_Low; D3_Low; D4_High; D5_High; delay_ms(dur);}
#define step7 {D2_Low; D3_Low; D4_Low; D5_High; delay_ms(dur);}
#define step8 {D2_High; D3_Low; D4_Low; D5_High; delay_ms(dur);}

void setup() 
{
  
step_init;
  
step_stop;
}

void loop()
Start
    step1
;
    
step2;
    
step3;
    
step4;    
    
step5;
    
step6;
    
step7;
    
step8;      
End 

Соответственно в полношаговом режиме скорость вращения будет в 2 раза выше
В будущем планирую написать для этого ШД библиотеку
Admin вне форума   Ответить с цитированием
Старый 08.05.2013, 12:59   #2
Serega7411
Junior Member
 
Регистрация: 08.04.2013
Сообщений: 9
Вес репутации: 0
Serega7411 is an unknown quantity at this point
По умолчанию

Тоже эксперементировал с таким шаговиком для управления оконными жалюзями. Хотелось чтобы подходили к 2-м жалюзям 4 провода (2 витых пары, а не 9 = 1 земля питания + 4 фазы + 4 фазы для управления всеми обмотками), поэтому сделал управление на ATTINY2313 и ULN2003, макетка влезла внутрь корпуса жалюзи. ATTINY2313 управляется по UART, т.е. требуется 4 провда "+","-","rx","tx". Реализованы 4 команды полное открытие, полное закрытие, открытие на определенный угол, закрытие на определенный угол. Открытие-закрытие делал поворотом пластин, поднятие/опускание не делал. Шаговик соединял с осью вращения через обрезок корпуса ручки, на ось и шаговик наматывал изоленту, чтобы и плотно было и могло немного проскользнуть. Небольшое проскальзывание нужно чтобы не использовать датчики конечных положений. При инициализации просто поворачивается на угол чуть больше максимального поворота, за счет проскальзывание выставляетс в "0". Потом уже от этого нуля высталяется угол.

PHP код:
#include <avr/io.h>//Подключаем библиотеку ввода/вывода

#define MAX_COMMAND_LEN 16 //Максимальная длина команды
#define DEVICE_NUM 1 //Номер этого устройства
#define NUM_DRIVES 2 //Количество приводов
#define nop() {asm("nop");}//подключаем функция для формирваония задержки

void Close (unsigned char Driveunsigned char Count);//Прототип функции поворота ротора ШД вправо
void Open (unsigned char Driveunsigned char Count);//Прототип поворота влево
void USART_Init();
unsigned char USART_Receivevoid );
//void USART_Transmit( unsigned char data );
unsigned char USART_Command[MAX_COMMAND_LEN];
static 
unsigned char CurrentPos[NUM_DRIVES];

int m=1//переменные

bool ReadCommand(void)
{
    
unsigned char UART_char;
    
    
//Очищаем буфер
    
for(unsigned char Count 0;Count<MAX_COMMAND_LEN;Count++) USART_Command[Count]=0;
    
    
//Читаем первый символ
    
UART_char USART_Receive();
    
    
//Исли первый символ не '#', значит это не начало команды
    
if (UART_char == '#'UART_char USART_Receive();
    
    
//Читаем дальше если команда для этого устройства или 0 (широковещательный адрес, для всех)
    
if ((UART_char == 0)||((UART_char == DEVICE_NUM))) {
        
        
//Читаем UART и заполняем буфер
        
for(unsigned char Count 0;Count<MAX_COMMAND_LEN;Count++)
        {
        
UART_char USART_Receive();
        
USART_Command[Count] = UART_char;
        if(
UART_char == '\n') break;//Если "окончание строки", то считаем что закончили считывать команду
        
}
    
        
//На всякий случай, если переданная строка больше размера буфера в конце ставим "окончание строки"
        
USART_Command[MAX_COMMAND_LEN-1] = '\n';
        
        
//Удачно считали команду
        
return true;
        
    }        
    
    
//Исли символ не '#', значит это это не команда
    
else return false;
}
    
int main(void)
{
    
    
unsigned char N,P;
    
DDRB 0xFF;//Конфигурирования порта на выход
    
PORTB 0x00;//Отключаем подтягивающие резисторы порта
    
CurrentPos[0] = 170;//Считаем что жалюзи открыты, чтобы закрыть их
    
CurrentPos[1] = 170;
    
Close(0,175);//Закрываем жалюзи
    
    
USART_Init();
    
//USART_Transmit('D');
    
for(;;)         //Вечный цикл
    
{
        if (
ReadCommand()){ 
        
//Формат команды: C N P
        //C-байт команды, N-байт номер привода, P-байт параметр
        
USART_Command[1];
        
USART_Command[2];
        
        if (
<= NUM_DRIVES)
        switch(
USART_Command[0]){
                case 
'O':
                
Open(N,170);
                break;
                case 
'C':
                
Close(N,180);
                break;
                case 
'o':
                
Open(N,P);
                break;
                case 
'c':
                
Close(N,P);
                break;
            }
            
        }
    }
    
}

//Функция задержки
void delay(int t)
{
    for (
int x=0x<;x++)
    
nop ();
}

//Функция поворота ротора вправо
//Drive - номер привода (0, 1, ...)
//Count - количество циклов поворота
void Open(unsigned char Driveunsigned char Count)
{
    
unsigned char NewPosBit;
    
    
//Определяем какой бит(номер вывода, к которому подключен ШД) будеv двигать (0 - оба)
    
Bit = (Drive==0) ? 0b10001000 Bit = (Drive==1) ? 0b00001000 0b10000000;
    
    
//Определяем новую позицию, куда нужно переместить ШД
    
NewPos = ((CurrentPos[Drive] + Count) >= 170) ? 170 CurrentPos[Drive] + Count;
    
    for(
unsigned char i CurrentPos[Drive]; NewPosi++)
    {
    
    
PORTB Bit;//обмотка A
    
delay(3000);

    
PORTB>>=1;//обмотка B
    
delay(3000);

    
PORTB>>=1;//обмотка C
    
delay(3000);

    
//PORTB = 0b00010001;//обмотка D
    
PORTB>>=1;//обмотка D
    
delay(3000);
    
    }
    
PORTB=0x00;
    
    
CurrentPos[Drive] = NewPos;//Запоминаем позицию, в которой находятся жалюзи
    
}

//Функция поворота ротора влево
//Drive - номер привода
//Count - количество циклов поворота
void Close(unsigned char Driveunsigned char Count)
{
    
unsigned char Delta,Bit;
    
    
//Если количество шагов больше чем может быть (упрется в ограничитель), 
    //то выводим в 0 с запасм 5 шагов (вдруг не успел IL отрабоать что-то из-за частоты, напряжения и т.д.)
    
if (CurrentPos[Drive] < Count){
        
Delta CurrentPos[Drive] + 5;//Определяем на сколько нужно помернуть ШД
        
CurrentPos[Drive] = 0;//Запоминаем позицию, в которой находятся жалюзи
        
}
    else {
        
CurrentPos[Drive] -= Count;//Определяем на сколько нужно помернуть ШД
        
Delta Count;//Запоминаем позицию, в которой находятся жалюзи
        
}
    
    
//Bit = (Drive==1) ? 0b00000001 : 0b00010000;//Определяем какой бит(номер вывода, к которому подключен ШД) будет двигать
    
Bit 0b00010001;
    
    for(
unsigned char i=0i<Deltai++)
    {
    
PORTB=Bit;
    
delay(3000);

    
PORTB<<=1;
    
delay(3000);

    
PORTB<<=1;
    
delay(3000);

    
PORTB<<=1;
    
delay(3000);
    }
    
PORTB=0x00;
    
}

void USART_Init(void//Функция инициализации USART
{
    
unsigned int speed;
    
speed 103;//9600
    
UBRRH = (unsigned char) (speed>>8);
    
UBRRL = (unsigned charspeed;
    
UCSRA = (1<<U2X); //Удвоение скорости
    
UCSRB = ( ( << RXEN ) | ( << TXEN ) ); //Разрешение на прием и н апередачу через USART
    
UCSRC = (1<<USBS) | (3<<UCSZ0);
}

unsigned char USART_Receivevoid //Функция приема данных
{
    while ( !(
UCSRA & (1<<RXC)) );     //Ожидание приема символа
    
return UDR//Возврат символа
}
/*
void USART_Transmit( unsigned char data ) //Функция отправки данных
{
    while ( !(UCSRA & (1<<UDRE)) ); //Ожидание опустошения буфера приема
    UDR = data; //Начало передачи данных
    
}*/ 
Serega7411 вне форума   Ответить с цитированием
Старый 08.05.2013, 13:19   #3
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Спасибо.
Мне понравилась реализации шага методом сдвига.
Таким образом можно просто реализовать хранение последнего местоположения и сам процесс шага
Из недостатков такой реализации, управление мотором нужно подключать к одному GPIO
Admin вне форума   Ответить с цитированием
Старый 12.07.2017, 08:52   #4
Влад54
Junior Member
 
Регистрация: 11.07.2017
Сообщений: 13
Вес репутации: 0
Влад54 is an unknown quantity at this point
По умолчанию

Тоже инитересует тема управления скоростью вращения ШД, но не совсем пока разбираюсь в чужих скетчах.
Какие способы управления скоростью ШД существуют (кроме задержки) для изменения частоты управляющих импульсов?
Нужно менять скорость такого ШД в соответствии с определенной мат. зависимостью.
Влад54 вне форума   Ответить с цитированием
Старый 13.07.2017, 10:19   #5
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Можно математически изменять задержку между импульсами
Admin вне форума   Ответить с цитированием
Старый 14.07.2017, 15:19   #6
Влад54
Junior Member
 
Регистрация: 11.07.2017
Сообщений: 13
Вес репутации: 0
Влад54 is an unknown quantity at this point
По умолчанию

Математически задержку и предполагалось менять. Вопрос был в том. Есть ли способы управления скоростью без использования функции задержки между импульсами
Влад54 вне форума   Ответить с цитированием
Старый 16.07.2017, 11:34   #7
Влад54
Junior Member
 
Регистрация: 11.07.2017
Сообщений: 13
Вес репутации: 0
Влад54 is an unknown quantity at this point
По умолчанию

Еще одна проблема нарисовалась.
Моя Ардуинка не допускает операций с плавающей точкой, но в программе появляются числа (и операции с плавающей тчк.). Необходимо так же использовать тригонометрические ф-ции в которых как раз в качестве аргумента не целые радианы используются. Получается с моей платой вообще тригонометрия не предусмотрена? Возможно ли использование целочисленного аргумента в градусах?
Понимаю, что немного не по теме. Может в другой отдел перенести?
Влад54 вне форума   Ответить с цитированием
Старый 16.07.2017, 23:19   #8
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Цитата:
Моя Ардуинка не допускает операций с плавающей точкой
Любой контроллер может
Добавьте соответствующую библиотеку
Admin вне форума   Ответить с цитированием
Старый 17.07.2017, 10:22   #9
Влад54
Junior Member
 
Регистрация: 11.07.2017
Сообщений: 13
Вес репутации: 0
Влад54 is an unknown quantity at this point
По умолчанию

Цитата:
Сообщение от Admin Посмотреть сообщение
Любой контроллер может
Добавьте соответствующую библиотеку
Подозреваю, что при этом скорость вычислений и соответственно скорость вращения ШД измениться так как вычислять функцию с плавающими переменными придется в бесконечном цикле.
Какие то способы избежать операций с плавающей тчк. существуют?
Влад54 вне форума   Ответить с цитированием
Старый 17.07.2017, 11:19   #10
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Что бы из числа с запятой получить простое число , нужно его умножить на 1000 или на 1000000, в зависимости от числа знаков после запятой
Admin вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 3 (пользователей: 0 , гостей: 3)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 13:44. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика