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

Tomade

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

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

  • Посещение

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


  1. Пришли IR3310. Методом проб и ошибок остановился на такой схеме (см. рисунок). Может, не совсем грамотно и не совсем рационально, но из имеющихся деталей, работает и IR3310 не греется с маленьким радиатором. Может, кому-то пригодится.
  2. Они в пути, почтовой посылкой. Придут - так и сделаю. ---------- А вот ещё вопрос. Движок будет потреблять десятки Ампер. Сам по себе движок работает от мостикового выпрямителя на мощных диодах (то есть без всякого сглаживающего фильтра). А как в этом случае будут себя вести IR-ки? Если их желательно питать сглаженным напряжением, то как это сделать при таких больших токах?
  3. Kotopuz и Haker Fox, спасибо за участие. Писк движка не волнует - установка будет работать в цеховых условиях, где речь-то с трудом услышишь. Частоту ШИМ, думаю, увеличивать не стоит, так как заказал в ChipInfo IR3310, частота переключения которого ограничена пятьюстами Герцами. Эта сборка коммутируют ток до 100 А (а IRF540N - только до 28 А). Не совсем понятно, для чего нужно ограничивать сначала ток, заведя обратную связь от датчика тока. Импульсный ток при ШИМе не ограничишь; он будет плавно уменьшаться по мере разгона двигателя. Так что IRF-транзистор может сгореть при первом же импульсе ШИМ, если подобран не правильно, и никакая обратная связь не поможет. Впрочем, я в этих делах ещё чайник. Как писал в начале темы, макет уже сделан и испытан на маломощном двигателе. Датчик скорости вращения сделал на оптопаре: один оборот - один импульс. Так как скорость вращения не высока, то измеряю не частоту, а период. Микроконтроллер ATMega128 взял только потому, что подарили платку с уже установленным микроконтроллером с обвязкой и разъёмами. Так что задача - согласовать это устройство с мощным движком постоянного тока. Чем и занимаюсь с вашей помощью.
  4. Любопытная информация... В первом приближении подходит: и ток 100 А (для модификации IR3310), и частота переключения до 500 Гц (а ШИМ у меня - около 100 Гц). Попробую заказать и поиграться.
  5. Для меня не важно, какое напряжение требуется для этого двигателя - 24, 27 или 36 Вольт. Да и не думаю, что мощные низковольтные ключи со схемами управления имеют такую подробную градацию: отдельно для 24 Вольт, отдельно для 27, отдельно для 36. Если найдётся управляемый выходом микроконтроллера ключ для 50-вольтового движка, то, ИМХО, им же можно будет управлять и 27-вольтовым двигателем.
  6. Единичный. Когда-то снятый отставниками с какого-то самолёта. Напряжение питания, с их слов, 24 или 36 Вольт. Дайте (кто знает), пожалуйста, ссылку на конкретную реализацию (самодельную или промышленную) связки "драйвер-мощный ключ" для низковольтного двигателя постоянного тока. Или популярную статью/литературу, изучение которой позволит самому разобраться в проблеме и самому сделать требуемое.
  7. Есть такая задача: плавно разгонять двигатель постоянного тока и при достижении заданной скорости вращения его останавливать. Управляющее устройство сделал на микроконтроллере ATMega128, выход ШИМ подключил через транзистор IRFZ24 к малогабаритному двигателю постоянного тока (ДПТ), питающее напряжение - 27 Вольт постоянного, ток - около 1 А. Это всё работает. А вот управлять надо другим ДПТ, на котором нет никаких шильдиков. Тип -неизвестен; диаметр движка - 80 мм, высота - 200 мм, два вывода, из них один - на корпусе. Правда, на фланце кто-то от руки написал "36 В". При подключении этого ДПТ к переменному наряжению 32 В через один мощный диод потребляемый ток замерить не удалось (нечем), но оценочно он заметно превышает 50 А. Опыта управления мощными ДТП (в свете рассматриваемой задачи) не имею никакого. Подскажите, пожалуйста, как согласовать ШИМ-выход МК с мощным низковольным двигателем постоянного тока.
  8. Ну вот, проблема решилась. Сделал следующее. 1.Сгенерировал начальные коды под микроконтроллер ATMega64L (было ATMega16). 2.В строке sprintf(lcd_buffer,"%u",x); вместо u поставил lu (как ранее советовал АНТОХА. Всем спасибо.
  9. Антоха: Клевета! Было маленькое L - l. Прошу прощения. Был сбой при передаче данных. :) zhevak: Читайте книжки, посещайте форумы и уточняйте, что Вам не ясно. Потому и обратился сюда. В моём окружении программистов МК нет.
  10. АНТОХА: Надо не I, а L! (от long) В вашем предыдущем письме было I. Впрочем, ставил и I, и l, и L - не помогает. В этих случаях совсем ничего не высвечивается. bloodden: Как и в CVAVR впрочем тоже. В настройках проекта. По-умолчанию там стоит до инта. В предыдущем письме сообщал, что перепробовал разные настройки. Не помогло. zhevak: Вы неправильно используете модификаторы. Я попробовал и так sprintf(s1, "%li", x); и так sprintf(s1, "%ld", x); -- работает в обоих случаях. Проблема в том, что я не программист. Можно сказать, радиолюбитель, решивший самостоятельно изучить МК (и СИ) и что-то на них собирать. Потому то, что для программиста очевидно, для меня - далеко не так. А именно: sprintf(s1, "%li", x); // Библиотечная функция - где эта функция должна находиться? Как проверить, что она есть? И если нет, то где взять и куда вставить? LCD_StringXY(0, 1, s1); // -- это моя функция, у Вас должно быть что-то свое. Если бы знать, что своё должно быть... А просто поставить, к примеру, sprintf(s1, "%li", x); - ни к чему не приводит. Короче, пойду покупать пистолет.
  11. Спасибо всем откликнувшимся. Вот что получилось (компилятор - CVAVR 1.25.2). Если в строке sprintf(lcd_buffer,"%i",x) вместо i ставить I или Iu, то в симуляторе на табло LCD вообще ничего не выводится (и для int, и для long). После игры в метод тыка оказалось, что правильно выводятся числа до 65535, если вместо i ставить просто u, причём независимо от настроек, о которых говорил zhevak в последнем письме. Другие варианты, перечисленные в справке CVAVR для (s)printf features, ни к чему не привели. Как же вывести на экран LCD число, большее 65535?
  12. Так и делал: char lcd_buffer[33]; unsigned long int x = 32760; void main(void) { lcd_init(16); while(1){ sprintf(lcd_buffer,"%i",x); lcd_clear(); lcd_puts(lcd_buffer); x++; delay_ms(20);}} - эффекта никакого.
  13. Подскажите чайнику, как переехать такую проблему. Микроконтроллер серии ATMega, нужно выводить на ЖКИ типа РС1602F (c контроллером) инкрементируемую переменную, которая может принимать значения, к примеру, от 0 до 1 000 000. Работу программы (см. вложение) симулирую на VMLAB3.12. Что получается? До значания переменной, равного 32767, всё идёт нормально. А вот следующее индицируемое число равняется -32768 (со знаком минус), и все последующие начинают декрементироваться, то есть -32767, -32766, -32765 и т.д. Почему?
  14. Заметил свою ошибку: посчитал Т2 шестнадцатиразрядным. Если в строке M2=(unsigned long int)Perepol_Timer2*65536+count_T2; вместо 65536 поставить 256, то работа частотомера становится стабильной (начиная со второго измерения). Однако частота индицируется равной 16384 Гц, а не 10000 Гц. Почему?
  15. Попробовал написать программу по методу GM, за основу взял программу Яrik_а. Микроконтроллер - ATMega 64L, тактовую частоту взял 1 мГц (просто для тренировки). Вместо нулевого таймера, который задействован у Яrik_а, взял таймер_2. Работу программы проверял в VMLABе, смоделировав там пульсовый генератор меандра частотой 10 кГц. Но ничего хорошего не получилось. Вместо ожидаемой индицируемой частоты 10 кГц на ЖК-индикаторе VMLABа в каждом цикле высвечиваются разные значения - от 2 до 30 кГц, причём бывают и отрицательные числа. Подскажите, пожалуйста, где ошибка в программе. static float Fx; unsigned long int N1, N2, N; unsigned long int M1, M2, M; unsigned int Perepol_Timer2=0, Perepol_Timer1=0; unsigned int count_T1, count_T2; // Timer 1 overflow interrupt service routine interrupt [TIM1_OVF] void timer1_ovf_isr(void) { Perepol_Timer1++; } // Timer 1 input capture interrupt service routine interrupt [TIM1_CAPT] void timer1_capt_isr(void) { TIMSK&=0xDF; count_T2=TCNT2; count_T1=ICR1; } // Timer 2 overflow interrupt service routine interrupt [TIM2_OVF] void timer2_ovf_isr(void) {Perepol_Timer2++;} void main(void){ // Timer/Counter 1 initialization TCCR1A=0x00; TCCR1B=0xC1; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; OCR1CH=0x00; OCR1CL=0x00; // Timer/Counter 2 initialization TCCR2=0x07; TCNT2=0x00; OCR2=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x64; ETIMSK=0x00; #asm("sei") Perepol_Timer1=0; Perepol_Timer2=0; N1=0;M1=0; while (1) { delay_ms(1000); TIMSK|=0x20; while ((TIMSK&0x20)==0x20){} N2=(unsigned long int)(Perepol_Timer1)*65536+count_T1; M2=(unsigned long int)Perepol_Timer2*65536+count_T2; N=N2-N1; M=M2-M1; Fx=(float)1000000.0*(float)M/(float)N; //Здесь идёт вывод измеряемой частоты Fx на ЖК-индикатор N1=N2; M1=M2; }}
  16. Поделитесь, пожалуйста, наработками. Думаю, начинающим, вроде меня, будет полезно посмотреть.
  17. Знатоки, подскажите, пожалуйста, как реализовать частотомер по методу GM на ATMega64L. По описанию, у этого микроконтроллера нет входа для внешнего сигнала T0. Может, можно вместо таймера Т0 использовать таймер Т2?
  18. Захват в ATMega64

    Спасибо за предупреждение. Естественно, виртуальный секс - хорошо, а реальный - лучше . В качестве макетки собираюсь использовать плату с ATMega64L от сторонней фирмы, ЖКИ со встроенным контроллером - есть, в качестве датчика скорости вращения шпинделя буду использовать самодельный генератор прямоугольных импульсов с регулируемой частотой.
  19. Захват в ATMega64

    Так вот где собака зарыта! Сделал по-вашему и... заработало! Так, пожалуй, с вашей помощью на старости лет программистом заделаюсь :08: . Спасибо! Однако пойду дальше...
  20. Захват в ATMega64

    Именно так я и хотел сделать. А так как это моя первая в жизни программа (я не программист), то, естественно, сразу ничего не получилось, потому решил делать по частям, а именно: - убедиться, что захват при поступлении на вход ICP1 спадающего фронта импульса происходит. Для этого в подпрограмме прерывания по захвату сделал вывод на РЕ2 "отрицательного" импульса. Убедился, что эта часть работает. В симуляторе спадающий фронт формирую, замыкая на землю вход PD4 кнопкой К0 и контролируя это на осциллографе симулятора; - вывести на ЖКИ любое сообщение, или константу, или инкрементируемое число. Здесь не имеет значения частота поступления на вход будущего устройства импульсов от датчика скорости вращения шпинделя; просто хотел убедиться, что вывод на экран ЖКИ происходит после очередного нажатия кнопки К0 симулятора, то есть после наступления события захвата. Ан нет, не получилось: кроме естественной 2-х секундной задержки при запуске программы, вызыванной инициализацией ЖКИ, откуда-то берётся примерно такая же задержка (точное её значение в рассматриваемом случае не имеет никакого значения) при каждом нажатии кнопки К0 симулятора (то есть при каждом захвате). Где в тексте программы ошибка? ----- Насчёт прерывания по переполнению... Это не специально, это из-за неправильной настройки генератора начального кода CVAVR. Однако существенно ли это для заданных вопросов? Короче, забудем начальную задачу (тахометр, и не просто, а следящий за непрерывно меняющейся скоростью вращения). Вернёмся к программе в начале темы: где в ней ошибки? Откуда задержка вывода импульсов при наступлении событий захвата? Почему после первого инкрементирования и вывода на ЖКИ числа в дальнейшем выводимое на ЖКИ число не меняется, хотя импульсы на выходе РЕ2 генерируются? Напомню, что до этой задачи, в порядке изучения микроконтроллеров AVR, я делал вывод на ЖКИ инрементируемого числа при подаче (тоже симулятором) импульса на вход INTn - и всй работало! То есть после первой и единственной примерно 2-х секундной задержки при запуске программы дальше числа на ЖКИ выводились практически без всяких задержек (визуально).
  21. Захват в ATMega64

    Не измерял. Просто внизу поля VMLAB бегут цифры (время в миллисекундах) - вот и получилось, что задержка от подачи сигнала на вход ICP1 микроконтроллера до появления на выходе PE2 импульса примерно равна 2 секундам. Хотя если то же самое делать не от прерывания по захвату, а от, к примеру, INT1, то никаких задержек практически нет. Согласен. Так это я сделал только лишь временно, для учебно-отладочных целей, чтобы убедиться в том, что микроконтроллер воспринял сигнал захвата и стал обрабатывать прерывание. Я же самый-самый начинающий, до остановов ещё не дошёл. Так что вопросы пока остаются.
  22. Захват в ATMega64

    Помогите, пожалуйста, начинающему чайнику. Задача - сделать измеритель/индикатор скорости вращения двигателя постоянного тока (до 12 тысяч оборотов в минуту). Для начала написал программу, которая анализирует наличие сигнала на ножке захвата ICP1 (PD4 контроллера ATMega 64L) и при его поступлении выводит на вывод PE2 импульс, который можно наблюдать на осциллографе симулятора VMLAB (это для изучения и отладки), инкрементирует текущее (произвольное) число и выводит это число на LCD cимулятора. Что же получилось? После запуска программы около 2 секунд инициируется LCD (это нормально), на его экран выводится число 25. Затем в симуляторе подаётся импульс на PD4. По идее подпрограмма прерывания по захвату должна выработать импульс "отрицательной" полярности длительностью 5 мс, инкрементировать число 25 и вывести на экран LCD число 26. Однако происходит следующее: после первой подачи импульса захвата на выводе PE2 генерируется импульс с задержкой около 2 сек, число 26 тоже появляется с такой же задержкой; начиная со второго импульса захвата число 26 уже не инкрементируется, а выходные импульсы на PE2 продолжают генерироваться с такой же задержкой. Вопросы: откуда такая задержка при подаче импульсов захвата? Почему число инкрементируется только один раз? #include <mega64.h> // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x1B ;PORTA #endasm #include <lcd.h> #include<stdio.h> #include<delay.h> // LCD display buffer char lcd_buffer[33]; unsigned int x = 0x00; void __vivod_LCD(void) { //Функция вывода на ЖКИ sprintf(lcd_buffer,"%i",x); //Запись в буфер ЖКИ lcd_clear(); //Очистка экрана ЖКИ lcd_puts(lcd_buffer); //Вывод на ЖКИ } // Timer 1 input capture interrupt service routine interrupt [TIM1_CAPT] void timer1_capt_isr(void) { PORTE.2=0; delay_ms(5); PORTE.2=1; x++; __vivod_LCD (); } void main(void) { // Input/Output Ports initialization PORTA=0x00; DDRA=0x00; PORTD=0xFF; DDRD=0x00; PORTE=0xFF; DDRE=0x0FF; // Timer/Counter 1 initialization // Clock source: T1 pin Falling Edge TCCR1A=0x00; TCCR1B=0x81; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; OCR1CH=0x00; OCR1CL=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x24; ETIMSK=0x00; // LCD module initialization lcd_init(16); x=25; __vivod_LCD (); #asm("sei") while (1) { } }
×
×
  • Создать...