Помогите найти подобие lb1838 но на 12вольт
Помогите найти подобие lb1838 но на 12вольт
Нарыл с дисковода драйвер шагового движка lb1838, мне он очень понравился тем что можно тремя ножками моторчик крутить (ena1 и ena2 можно объединить), а значит на один контроллер можно их больше повесить, но у нее минус максимальное наряжение в 9вольт, нужно до 14вольт. Может кто знает подобный дривер, на большее напряжение.
- Реклама
Re: Помогите найти подобие lb1838 но на 12вольт
Стоимость и доступность сдвигового регистра серии 595 такова, что позволяет не обращать внимание на кол-во "ножек" в подобных задачах, а значит утверждение "понравился тем что можно тремя ножками моторчик крутить" не выдерживает критики и не может быть нормальным критерием для поиска драйвера.
Re: Помогите найти подобие lb1838 но на 12вольт
Не согласен! Зачем мне на плате лишнее. У каждого свои тараканы
Re: Помогите найти подобие lb1838 но на 12вольт
Я как раз с флопаря сдул какой-то KA28xx (производитель - Fairchild). И шаговик оттуда же. По найденому даташиту до 15 вольтов держит. У него вообще по сути 2 сигнала, задающих полярность каждой фазы. Есть chip enable но он странный, я так и не понял на что влияет, ток через обмотки не вырубает. Впрочем с тем степпером и чипом не так уж важно, они с самого начала ОК насчет такого режима. Насколько это до сих пор производится и продается - хз.
А что до сдвиговых регистров - ну, знаете?! Шаговикам все же какие-никакие времянки надо формировать, и когда это просто лапки, вон того шаговика переключить - одно, а когда кучу битов в регистр загонять, с точки зрения программирования и трекинга состояний кучи шаговиков это уже трэш какой-то. Вместо тривиального кода делающего что задумано будут какие-то костыли, потому что в лоб сменить в момент X состояние только потребных лапок не трогая остальные - уже ой. В таком случае может иметь смысл взять процик с чуть большим количеством лапок.
А что до сдвиговых регистров - ну, знаете?! Шаговикам все же какие-никакие времянки надо формировать, и когда это просто лапки, вон того шаговика переключить - одно, а когда кучу битов в регистр загонять, с точки зрения программирования и трекинга состояний кучи шаговиков это уже трэш какой-то. Вместо тривиального кода делающего что задумано будут какие-то костыли, потому что в лоб сменить в момент X состояние только потребных лапок не трогая остальные - уже ой. В таком случае может иметь смысл взять процик с чуть большим количеством лапок.
Re: Помогите найти подобие lb1838 но на 12вольт
Сколько же у вас ШД и с какой частотой их крутите чтобы это стало критично ? ) Код сильно отличаться не должен, просто дергать пины будете через функцию-прокладку.
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
- Реклама
Re: Помогите найти подобие lb1838 но на 12вольт
не знаю, вдруг кому пригодится. Код для lb1838 под атмегу8.
рабочий, проверено, шаговик крутит туда-сюда.
Спойлер
Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
//-------------------------------------------------------------------------
// Управление портом B
//-------------------------------------------------------------------------
#ifdef PORTB
#define PORTB_OUT_ALL() (DDRB = 0xFF);
#define PORTB_IN_ALL() (DDRB = 0x00);
// Настройка порта B на выход по пинам
#define PORTB_OUT(x) (DDRB |= (1 << x))
// Настройка порта B на вход по пинам
#define PORTB_IN(x) (DDRB &= ~(1 << x))
// Вывод в порт B по пинам 1
#define PORTB_ON(x) (PORTB |= (1 << x))
// Вывод в порт B по пинам 0
#define PORTB_OFF(x) (PORTB &= ~(1 << x))
// Чтение из порта B по пинам
#define PORTB_RD(x) (PINB & (1 << x))
// Инвертирование битов порта B
#define PORTB_XOR(x) (PORTB ^= (1 << x))
// Вывод значения в порт
#define PORTB_DATA_OUT(b) PORTB = b
// Чтение из порта
#define PORTB_DATA_IN() PINB
//---------------------------------------------
#define EN1 1
#define EN2 2
#define IN 3
#define RVRS 0
#endif
char i = 1;
uint16_t steps = 0;
char flag_STOP = 1;
char flag_RVRS = 0;
ISR(TIMER2_COMP_vect)
{
PORTB ^= (1 << EN1)|(1 << EN2);
if(!i) {PORTB_XOR(IN); i = 2;} else;
i--;
steps--;
OCR2 = 0x25;
}
ISR(INT0_vect)
{
}
void setup(void)
{
asm("wdr");
MCUCSR &= ~(1<<WDRF); /* Clear WDRF in MCUSR */
WDTCR |= (1<<WDCE) | (1<<WDE); /* Write logical one to WDCE and WDE */
/* Keep old prescaler setting to prevent unintentional time-out */
WDTCR = 0x00; /* Turn off WDT */
//---------------Ports-----------------------
PORTB_IN(RVRS);
PORTB_ON(RVRS);
PORTB_OUT(EN1); //PB1, PB2 out
PORTB_OUT(EN2);
PORTB_OUT(IN);
PORTB_OFF(EN1);
PORTB_OFF(EN2);
PORTB_OFF(IN);
//--------Timer2-------------------
TCCR2 = 0; // set entire TCCR2A register to 0
TCNT2 = 0x00; // initialize counter value to 0xFF
// 256 presc. toggle OC2 PWM Pfase Correct
TIMSK |= (1 << OCIE2);
OCR2 = 0x25; // 500Hz 0x25 для тактов
sei();
}
int main(void)
{
setup();
while(flag_STOP)
{
if(PORTB_RD(0))
{
PORTB_ON(EN1); PORTB_OFF(EN2); PORTB_ON(IN); flag_RVRS = 1; TCCR2 |=(1 << WGM21)|(1 << CS22)|(1<< CS21)|(1<< CS20); steps = 477;
} else
{
PORTB_ON(EN2); PORTB_OFF(EN1); PORTB_OFF(IN); flag_RVRS = 0; TCCR2 |=(1 << WGM21)|(1 << CS22)|(1<< CS21)|(1<< CS20); steps = 477;
}
while (steps){};
PORTB &= ~(1 << EN1)|(1 << EN2);
TCCR2 = 0;
flag_STOP = 0;
}
}


