Перейти к содержанию
    

Gogan

Участник
  • Постов

    83
  • Зарегистрирован

  • Посещение

Весь контент Gogan


  1. Пока что выбрали ДПТ 200 Вт, 24В, номинал 3000об/мин, два редуктора на 5 и 100, кодовый диск 120 меток/оборот на вал двигателя,регулировка скорости от 0,02 до 6,00 об/мин
  2. Помогите, пожалуйста, с выбором двигателя для сварочного вращателя. Поставлена задача - разработать сварочный вращатель для сварки труб и отводов, скорость на выходе от 0.05 .. 5 об/мин, максимальный момент на валу - 50 Н*м (500кг*см) (токарный патрон, на который крепятся трубы диаметром от ~50 до ~200 мм с отводами ~1м (отвод - поворот трубы). По предварительным расчетам, если брать маломощный асинхронный двигатель (АД) 250Вт, 3000об/мин, 2 редуктора последовательно в сумме передаточное число 600, тогда получим заданный момент с запасом. Для управления необходимо будет преобразователь частоты (ПЧ) с обратной связью по скорости (положению) вала двигетля, что сильно усложняет управление. Если брать моторедуктор дпт (постоянного тока), например 150Вт, тогда блок управления существенно упрощается, но нужно искать где в Киеве можно заказать такой двигатель, чтобы с выводом вала двигателя с другой стороны, чтобы установить свой кодовый диск на вал двигателя, либо искать энкодер и ставить после редуктора. Понадобится еще один редуктор ставить. Причем двигатели постоянного тока более требовательны к обслуживанию, в то ремя как АД - дубовые, но нужен ПЧ. Вобщем, пока плохо вижу оптимальное решение. Если брать шаговый двигатель, например FL86STH118-6004 (6A, 87kg*cm), то всеравно нужно ставить редуктор (для получения нужного момента на выходе). Мощный драйвер сделать для него не проблема, хотя сложнее чем для ДПТ. Не нужно обратной связи, но такой двигатель вроде бы некрасиво ставить в сварочный вращатель, нужно чтото дубовое, мне кажется шаговый здесь неуместен, и дороже получится. Такой шаговый порядка 250$, плюс редуктор 100$, в то время как асинхронник 80$ (примерно, говорю по памяти). Какие еще есть варианты? Подскажите плз, любые мысли по теме - приветствуются! Вариант с механическим переключением скоростей - отпадает из-за большой стоимости. заранее благодарен.
  3. В тему. Было как то у меня считывание кнопок по нулю, так вот во время выключения питания - напряжение на порте успевало упасть ниже уровня 0, в то время как контроллер еще работал. в итоге происходило считывание кнопки и отработка. Я это заметил, т.к. по кнопке происходила запись в EEPROM. Теперь все кнопки у меня срабатывают по верхнему уровню (т.е. порт подтянут к земле 10к (или больше), а кнопка подключает к нему +5В через 100 Ом)
  4. С I2C не работал, но по UART отправлял данные с компа на атмега и обратно. В codevision -> help topics (F1) -> CodeVisionAVR C Compiler Library Functions -> I2C bus functions - там все расписано. При создании проэкта - используешь мастер - там можно включить и UART и I2C. Если с английским сложно, тогда сори. Вот код для работы UART, если не ошибаюсь - частота контроллера 8мхз, скорость передачи 19200, размер слова 8бит, асинхронная передача, размер буфера - 8 байт... #define RXB8 1 #define TXB8 0 #define UPE 2 #define OVR 3 #define FE 4 #define UDRE 5 #define RXC 7 #define FRAMING_ERROR (1<<FE) #define PARITY_ERROR (1<<UPE) #define DATA_OVERRUN (1<<OVR) #define DATA_REGISTER_EMPTY (1<<UDRE) #define RX_COMPLETE (1<<RXC) // USART Receiver buffer #define RX_BUFFER_SIZE 8 char rx_buffer[RX_BUFFER_SIZE]; #if RX_BUFFER_SIZE<256 unsigned char rx_wr_index,rx_rd_index,rx_counter; #else unsigned int rx_wr_index,rx_rd_index,rx_counter; #endif // This flag is set on USART Receiver buffer overflow bit rx_buffer_overflow; // USART Receiver interrupt service routine interrupt [USART_RXC] void usart_rx_isr(void) { char status,data; status=UCSRA; data=UDR; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) { rx_buffer[rx_wr_index]=data; if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0; if (++rx_counter == RX_BUFFER_SIZE) { rx_counter=0; rx_buffer_overflow=1; }; }; } #ifndef _DEBUG_TERMINAL_IO_ // Get a character from the USART Receiver buffer #define _ALTERNATE_GETCHAR_ #pragma used+ char getchar(void) { char data; while (rx_counter==0); data=rx_buffer[rx_rd_index]; if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0; #asm("cli") --rx_counter; #asm("sei") return data; } #pragma used- #endif // USART Transmitter buffer #define TX_BUFFER_SIZE 8 char tx_buffer[TX_BUFFER_SIZE]; #if TX_BUFFER_SIZE<256 unsigned char tx_wr_index,tx_rd_index,tx_counter; #else unsigned int tx_wr_index,tx_rd_index,tx_counter; #endif // USART Transmitter interrupt service routine interrupt [USART_TXC] void usart_tx_isr(void) { if (tx_counter) { --tx_counter; UDR=tx_buffer[tx_rd_index]; if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0; }; } #ifndef _DEBUG_TERMINAL_IO_ // Write a character to the USART Transmitter buffer #define _ALTERNATE_PUTCHAR_ #pragma used+ void putchar(char c) { while (tx_counter == TX_BUFFER_SIZE); #asm("cli") if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0)) { tx_buffer[tx_wr_index]=c; if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0; ++tx_counter; } else UDR=c; #asm("sei") } #pragma used- #endif // ... далее в основном цикле для приема пишешь: if(rx_counter!=0){ a=getchar(); } // и для отправки - putchar('a');
  5. Для начала нужно решить, сколько знаков после запятой хочется получить. Например 4, тогда делить нужно 10000/n, результат будет от 1 до 10000, думаю дальше понятно что с ним делать. Используем двубайтное число (unsigned int). А готовый асемблеровский код можно легко получить если посмотреть откопиленный код с помощью CodeVison. Вот что у меня получилось (код на C: unsigned int a,b; ... a=432; b=10000/a; ) main: ;...... ; a=432 (a хранится в регистрах R4,R5) LDI R30,LOW(432) LDI R31,HIGH(432) MOVW R4,R30 ;b=10000/a (b хранится в регистрах R6,R7) MOVW R30,R4 LDI R26,LOW(10000) LDI R27,HIGH(10000) RCALL __DIVW21U MOVW R6,R30 ; ...... rjmp main __DIVW21U: CLR R0 CLR R1 LDI R25,16 __DIVW21U1: LSL R26 ROL R27 ROL R0 ROL R1 SUB R0,R30 SBC R1,R31 BRCC __DIVW21U2 ADD R0,R30 ADC R1,R31 RJMP __DIVW21U3 __DIVW21U2: SBR R26,1 __DIVW21U3: DEC R25 BRNE __DIVW21U1 MOVW R30,R26 MOVW R26,R0 RET
  6. Решил провести тепловой расчет и столкнулся с тем, что в интернете в разных справочниках разные данные - тепловое сопротивление слюды, алюминиевого радиатора разной площади и т.д. Так как в интернете практической инфы очень мало, то привожу результаты своих экспериментов. Сделал измеритель температуры от 3х датчиков - один DS18S20 (точность 0,5 С) и два KTY81/110 (терморезистивные, точность 2-3 С). Посадил транзистор IRFBE30 (800V, 4.1A, Rds=3.0, Rjc=1) на теплоотвод площадью 192 кв.см (типоразмер 72х26, длина 40мм). Промазал теплопроводящей пастой, положил слюду (толщина порядка 0.3, но не мерял. Нашел у себя моток такой ленты - слой слюды на стеклоткани, стеклоткань легко отслаивается), опять паста и транзистор. Далее на термопасте посадил два терморезистивных датчика на транзистор и рядом на радиатор, приложил термоизоляционным картоном (не помню как называется), прижал. Затвор вместе со стоком подключил на плюс, исток на минус. Подключил к +12В (напряжение на транзисторе было меньше за счет поадения на измерителе тока и проводниках). Включил, подождал пока стабилизируется температура (~15мин). Получил: U=9.62 V I=1.74 A Pd=16.74 W температура корпуса - 101 С температура радиатора - 89 С температура воздуха - 16 С Следовательно можно расчитать тепловое сопротивление слюды и радиатора: Rcs(case to sink)=0.72 C/W Rsa(sink to ambient)=4.36 C/W Далее подключил кулер (размер 40х10мм, 12В), разместил в притык к радиатору. Получил следующее: U=9.24 V I=2.10 A Pd=19.4 W температура корпуса - 71 С температура радиатора - 47 С температура воздуха - 16 С Rcs(case to sink)=1,24 C/W Rsa(sink to ambient)=1,6 C/W Таким образом есть хотя бы какие то цифры, которые можно округлять, брать с запасом и т.д. Разные значения Rcs видимо связаны с утечкой тепла от датчика температуры в окружающую среду, как это более детальней проанализировать - пока не придумал. Вобщем буду брать для этой слюды теплопроводность 1.2 (для корпуса TO-220), для алюминиевых радиаторов Rsa*S(площадь)=834 без обдува и ~300 с обдувом. Для расчета необходимой площади радиатора можно использовать формулу S=1000/Rsa. Спасибо за внимание.
  7. Интересная тема. Расскажу про свой опыт измерений. Я работал только с мега8 и мега16. При измерении сигнала от тензодатчика (0-18мВ) стоял инструментальный усилитель AD620 (дорогой собака - 10$) с коеф.ус.275 и с него на АЦП. В итоге на выходе (рисовал график на компе) получил все наводки - и помехи от силовой аппаратуры (модуляция 8кгц) и синфазные (50гц) на уровне до 10% от максимума (может, конечно, можно было увеличить RC фильтр, но я не стал). Частота контроллера 8мгц, предделитель ацп 128 (максимальный), ацп считает за 13 тактов (по даташиту), в итоге получается около 4800 результатов в секунду (мне необходимо было не меньше 2). В итоге я усреднял каждые 2500 результатов и получил почти идеально гладкий график. С наводками мне очень сложно бороться, какой бы фильтр не ставил, как бы подальше от силовых проводов не отводил, всеравно прыгает результат довольно значительно.
×
×
  • Создать...