Не работает схема управления двигателем.

Обсуждаем цифровые устройства...
Ответить
Открыл глаза
Аватара пользователя
Сообщения: 61
Зарегистрирован: Вт мар 01, 2011 13:51:57

Сообщение zip900 »

http://tigerail.narod.ru/P1090453.jpg

Изображение

Принцип работы... Микроконтроллер формирует ШИМ на своих выходах РВ1 и РВ0, в зависимости от требуемого направления движения, которое определяется положением движка резистора R1. С выходов контроллера упр1 и Упр2 сигналы подаются на ключи VT1 VT6, которые преобразовывают выходные ТТЛ уровни контроллера к сигналу размахом 0...12В для управления мостом на транзисторах VT2-VT5.

Принцип действия моста прост. При подаче одинаковых уровней на затворы транзисторов моста напряжения на стоках (точки подключения нагрузки) одинаковы, разность потенциалов равна 0, т.к. включены пары VT2,VT4 и выключены VT3, VT5 (или наоборот). Для подачи напряжения в нагрузку необходимо подать несимметричные уровни, например на затворы VT2, VT3 - 12B; VT4, VT5 - 0B. Тогда VT2 будет заперт, VT3 откроется, обеспечив на своем стоке потенциал земли. Противоположная пара будет находится в асимметричном состоянии - VT4 - открыт и обеспечивает потенциал равный питанию у себя на стоке, VT5- заперт. Таким образом на левой клемме подключения двигателя будем иметь 0В, на правом +12В, что обеспечит протекание тока в нагрузку. При обратной подаче несимметричных уровней на затворы получим противоположную полярность на нагрузке.

Резистор R8 является измерительным. Компаратор DA1 оценивает напряжение, выделяемое на нем и сравнивает с порогом, установленным резисторами R9 R10. Напряжение на измерительном резисторе пропорционально току, протекающему по каналам транзисторов и равно U=0.1*I. Максимальный ток для приведенных транзисторов достигает 4А, установим при помощи R9 R10 порог 350мВ. Тогда, при токе протекающем через транзисторы большем 3.5А, компаратор на выходе поставит лог.0 и сбросит контроллер.

Программа контроллера изменена относительно предыдущих таким образом, что после выхода из состояния сброс, контроллер не реагирует на действия пользователя до тех пор, пока движок резистора не будет установлен в положение "СТОП", при этом после первого включения и после превышения допустимого тока контроллер не выводит на выходы управления ШИМ и индицирует это состояние морганием светодиода, ожидая установки резистора R1 в положение "СТОП".


ВОПРОС????!!!!!!

Ребят собрал такую вот схему, прошил все вроде бы, но не работает, на выходах, на мотор по нулям. Думаю дело в МК. Напряжение от 0 до 5 В, относительно 2 и 8 а так же 2 и 4 ножек МК меняется, когда кручу переменный резистор. Но на выходах ног 6 и 5 ничего, тоесть упр 1 и упр 2 по нулям. Подозреваю криво прошил. Какие фьюзы выставлять надо? Шью в CodeVision либо в непомню как называется прога дома а я щас на работе.
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 39
Зарегистрирован: Чт июл 05, 2012 22:39:11
Откуда: Санкт-Петербург

Сообщение Petr57 »

Ну, то что на второй ноге напряжение меняется - тут ничего удивительного. На какую частоту работы мк запрограммирован? Фьюзы поищите в интернете и смотрите те, которые у вас есть в программаторе. Под нужную частоту и поставьте. Проверку после прошивки делали? Если да и ошибок не было, то либо сам код с ошибкой, либо действительно фьюзы не так выставлены.
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 61
Зарегистрирован: Вт мар 01, 2011 13:51:57

Сообщение zip900 »

Ну потом читал какойто HEX код присутствует заливается без ошибок, как еще проверить я хз, программатор обычный 5 резисторов и лпт порт, вот именно фьюзы под attiny 13, я не нашел мануала, и на частоте я хрен знает она должна работать. Могу выложить исходник прошивки
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Если МК после прошивки читается, то фьюзы выставлены на тактирование от внутреннего генератора, т.е. либо 8, либо 1 МГц, работать при этом схема все равно должна, просто частота ШИМ и светодиода будет либо в 8 раз меньше, либо в 8 раз больше, в зависимости от того, что на самом деле должно быть. Если при этом на выходах (включая светодиод) вообще ничего нет, то наверно прошивка кривая... Ну и проверить RESET, если там логический 0 (например если порог у компаратора не настроен), то работать естественно не будет.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Для начала написать моргание светодиодом, чтобы проверить сам мк. Исходник-то есть?
Пока без родного исходника(фузы родные, заводские), должно мигать с частотой 1 Гц:
Спойлер//Date : 05.09.2012
//Chip type : ATtiny13
//Clock frequency : 9,600000 MHz

#include <tiny13.h>
#include <delay.h>


void main(void)
{
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Func5=In Func4=In Func3=In Func2=Out Func1=In Func0=In
// State5=T State4=T State3=T State2=0 State1=T State0=T
PORTB=0x00;
DDRB=0x04;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;

while (1)
{
PORTB.2= 1;
delay_ms(500);
PORTB.2= 0;
delay_ms(500);
};
}
Вложения
test.hex
(455 байт) 285 скачиваний
Docendo discimus
Контактная информация:
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 61
Зарегистрирован: Вт мар 01, 2011 13:51:57

Сообщение zip900 »

Исходник высмысле нетронутая микруха есть. Диод имеете ввиду который по схеме стоит?
Ну и проверить RESET, если там логический 0 (например если порог у компаратора не настроен), то работать естественно не будет.
Каким образом его проверить?, на этой ноге по вольтажу должен быть 0?
Последний раз редактировалось zip900 Ср сен 05, 2012 11:52:05, всего редактировалось 1 раз.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Исходник - исходный текст программы. Его я нашел по вашей ссылке. Диод - светодиод, который подключен через резистор к порту PB2(вывод 7).
Docendo discimus
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 61
Зарегистрирован: Вт мар 01, 2011 13:51:57

Сообщение zip900 »

Вот исходный код прошивы на Си
Ссылка на всю статью http://tigerail.narod.ru/pwmmos.html

Код: Выделить всё

/*****************************************************
Project : PWM Bipolar Locomotive Controller; 
Version : 2.00 for MOSFET bridge with overcurrent protection.
Date    : 18.04.2007
Author  : Yuri V. Kalashnikov;                            
Company : KRTPC 
Comments: Bipolar PWM Power Supply Controller
 for railway models; 

questions you can send by e-mail: tigerail@yandex.ru


Chip type           : ATtiny13
Clock frequency     : 9,600000 MHz internal RC option;
                      CKSEL1..0 = 10; 
Memory model        : Tiny
External SRAM size  : 0
Data Stack size     : 16
*****************************************************/

#include <tiny13.h>
#include <delay.h>

void main(void)
{
int k,i;
int AH, AL;
int OC;


// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Func5=In Func4=Out Func3=In Func2=In Func1=Out Func0=Out 
// State5=T State4=0 State3=T State2=T State1=0 State0=0 
PORTB=0x00;
DDRB=0x17;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;


ADMUX=0x03; // Vcc as VRef, ADC connect to PB3 pin

ADCSRA=86;  // ADC enable, ADC CLK divider=0b110 (9600/64=150kHz)

OC=1;

while (OC==1)
  { // overcurrent/START cycle
    ADCSRA=0xC6; //START conversion
    PORTB.2=0;
    delay_ms(300);
    PORTB.2=1;
    delay_ms(300); 
    
    // ADC result performing
    AL=ADCL; // extract low part ADC result;
    AH=ADCH; // extract high part ADC result;
    k=AH*256; // shift high part to most significant byte;
    k=k+AL; // add low byte; 
    
    if ((k>412) && (k<612))
      {                   
        OC=0; // USER set trimmer to STOP position, out from cycle
      }
  }

 

while (1)
  { 
       ADCSRA=0xC6; //START conversion
       

       if ((k>412) && (k<612)) // CENTRAL "STOP" trimmer position

         {
           PORTB.2=0; // LED "STOP" is lighting;
           PORTB.1=0;
           PORTB.0=0;
         }
         else  //  412<k<612
           {
             PORTB.2=1; // LED "STOP" is OFF; 
             
             if (k<=412)  // RIGHT-turned trimmer position;
               {
                 k=412-k;

                 // Pulse Width Modulation cycles "FORWARD";
                 for(i=1; i<=k; i=i+1)
                   {
                     PORTB.0=1;
                     delay_us(10); 
                   }
                 for(i=k; i<=412; i=i+1)
                   {
                     PORTB.0=0;
                     delay_us(10);
                   }    
               
               } //(k<=412)         
               
             if(k>=612)    // LEFT-turned trimmer position; 
               {
                 k=k-612;
                 // Pulse Width Modulation cycles "BACK"; 
                 for(i=1; i<=k; i=i+1)
                   {
                    PORTB.1=1;
                    delay_us(10); 
                   }
                 for(i=k; i<=412; i=i+1)
                   {
                     PORTB.1=0;
                     delay_us(10);
                   }    
               } //(k>=612)
          
           } // else
       

       AL=ADCL; // extract low part ADC result;
       AH=ADCH; // extract high part ADC result;
       k=AH*256; // shift high part to most significant byte;
       k=k+AL; // add low byte; 
  };// while
}   // main
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Так, вопрос с частотой наполовину решился, автор программы позаботился о принудительном сбросе делителя на 8, так что если МК настроен на внутренний генератор, то его частота точно верная.
Что касается RESETа, то там должна быть строгая "1", если там будут хоть малейшие импульсы с нулем - МК будет сбрасываться.
Открыл глаза
Аватара пользователя
Сообщения: 61
Зарегистрирован: Вт мар 01, 2011 13:51:57

Сообщение zip900 »

Engineer_Keen писал(а):Так, вопрос с частотой наполовину решился, автор программы позаботился о принудительном сбросе делителя на 8, так что если МК настроен на внутренний генератор, то его частота точно верная.
Что касается RESETа, то там должна быть строгая "1", если там будут хоть малейшие импульсы с нулем - МК будет сбрасываться.
Как это проверить? Тестером и по поводу фьюзов в проге надо выставлять галочки вот какие? Прога codevision
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Фузы не трогайте, пусть остаются родные, заводские.
Docendo discimus
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 61
Зарегистрирован: Вт мар 01, 2011 13:51:57

Сообщение zip900 »

pyzhman то есть открываю прогу загружаю код прошивки жму прошить и радуюсь. Но не работает... Как выяснить хорошо или не хорошо у меня с ресетом?
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Ткнуться на RESET вольтметром, а лучше осциллографом, если там есть "1", то дело не в нем, надо копать дальше. А если там "0" постоянно или импульсами, значит проблема в компараторе (программатор после прошивки отключен от контроллера?).
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

2Engineer_Keen: ресет там подтянут к питанию, не думаю, что в нем проблема.
2zip900: последуйте совету Engineer_Keen'а, отключайте программатор. И чем шьете? Какие сообщения выдаются? Чип определяется программатором именно как 13-я тинька?
Docendo discimus
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 61
Зарегистрирован: Вт мар 01, 2011 13:51:57

Сообщение zip900 »

pyzhman у меня программатор отдельный, я шью на программаторе который 5 резисторов, вынимаю микруху и вставляю её на плату.
А в проге я сам выставляю модель микрухи Attiny13. Сообщения выдаются что прошивка была завершена успешно. Потом читаю прошиву появляется HEX кодировка
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

pyzhman писал(а):2Engineer_Keen: ресет там подтянут к питанию, не думаю, что в нем проблема.
Подтянут, это да. Но кто мешает компаратору его затянуть вниз? На этом принципе защита от перегрузки сделана, а что если она как раз и срабатывает?
Друг Кота
Аватара пользователя
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....

Сообщение Meteor »

Совсем не по теме.
Встречал несколько лет назад этот принцип управления, когда ширина ШИМ задает направление.
И даже собирал, на таймере 580ВВ53!
Один вопрос, двигатель не жалко?
В момент стояния двигатель сильно греется. Происходит это потому, что по обмоткам течет ток с частотой ШИМа (не ниже 500Гц рекомендуют), сперва в одну, а затем в другую сторону. Ротор в итоге неподвижен, а корпус движка раскален(
Подумайте, может ну его это управление, именно это управление. Есть ведь иные способы получения плавного изменения скорости и направления вращения.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 61
Зарегистрирован: Вт мар 01, 2011 13:51:57

Сообщение zip900 »

Ну так подскажите как при момощи тестера проверить ресет?
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Отсоедините вывод компаратора от ресета.
Docendo discimus
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 61
Зарегистрирован: Вт мар 01, 2011 13:51:57

Сообщение zip900 »

не помогло, если эта схема греет мотор какую другую схему посоветуете, помогте плиз
Ответить

Вернуться в «Цифровая техника»