МАКЕТ УПРАВЛЯЮЩЕЙ ПЛАТЫ ДЛЯ ЦИФРОВЫХ СЕРВОПРИВОДОВ НА MSP430 - Студенческий научный форум

VII Международная студенческая научная конференция Студенческий научный форум - 2015

МАКЕТ УПРАВЛЯЮЩЕЙ ПЛАТЫ ДЛЯ ЦИФРОВЫХ СЕРВОПРИВОДОВ НА MSP430

Шеманаев А.С. 1
1Санкт-Петербургский Национальный Исследовательский университет Информационных технологий, механики и оптики
 Комментарии
Текст работы размещён без изображений и формул.
Полная версия работы доступна во вкладке "Файлы работы" в формате PDF
Сервопривод это механизм с обратной связью по углу, который может поворачиваться на заданный угол от нулевой точки. Аналоговый сервопривод управляется меандром с некоторой скважностью, которая и задает угол. главным его недостатком является то, что рычаг не может остановиться в заданном положении, а рыскает вокруг него. В то время как цифровой сервопривод управляется однократно посылаемым цифровым сигналом и, ввиду дискретности, может остановиться в заданном положении с той точностью, которую позволяет его дискретность.

Рассмотренная в докладе плата является только макетом, в дальнейшем я планирую управлять через нее сразу тремя более мощными приводами.семейство микроконтроллеров MSP430 было выбрано из за удобной организации их памяти, а так же присутствия необходимой периферии. К тому же у меня под рукой есть отладочная плата с внутрисхемным отладчикомВ качестве датчика угла используется переменный резистор на 10кОм, а показания с него снимаются встроенным АЦП контроллера(в конечной задумке будет внешний АЦП), управление макетом от компьютера по UART. Используется внутренний UART микроконтроллера и терминал putty на стороне компьютера. Двигатель от платы управляется через H-мост и регулируется его мощность через ШИМ.

схема получилась очень простая Плата тоже простая, на лицевой стороне логическая часть повода в левой части идут к потенциометру(датчик угла). думаю тут логично использование дифференциальной пары и экранированного кабеля.

А на обратной стороне из транзисторов собран H-мост для управления двигателем

два желтых провода идут к двигателю и выдают либо положительный, либо отрицательный сигнал, который крутит его либо в одну, либо в другую сторону.

Логика работы простая — АЦП снимает показания и сравнивает с, хранящемся в буфере, необходимым значением, затем крутит двигатель в нужную сторону, потом опять сравнивает и так постоянно.Вот что получилось в итоге

http://youtu.be/jt0fBMxsHZo

код прошивки:

#include void printf(unsigned int x);static void puth(unsigned n);void putc(unsigned char c);unsigned int need,lastp,rxb;int main(void){ WDTCTL = WDTPW + WDTHOLD; // останавливаем ватчдог if (CALBC1_1MHZ==0xFF) // If calibration constant erased { while(1); // do not load, trap CPU!! } DCOCTL = 0; // Select lowest DCOx and MODx settings BCSCTL1 = CALBC1_1MHZ; // Set DCO DCOCTL = CALDCO_1MHZ; P1SEL = BIT1 + BIT2; // P1.1 = RXD, P1.2=TXD P1SEL2 = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD UCA0CTL1 |= UCSSEL_2; // SMCLK UCA0BR0 = 104; // 1MHz 9600 UCA0BR1 = 0; // 1MHz 9600 UCA0MCTL = UCBRS0; // Modulation UCBRSx = 1 UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine** IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt//безбожно сдутая из примеров кода TI инициализаия уарта P3DIR=0x01;//P3.0 - ШИМ P3SEL=0x01;//выбор альтернативной функции(TA0.2) P2DIR=0x03;//P2.0 и P2.1 - управление H-мостом P2OUT=0x00;//двигатель остановлен //конфигурация таймера A0 TA0CCR0 = 0x3000; // период ШИМ TA0CCTL2 = OUTMOD_7; // вывод TA0.2, тип выхода - выкл/вкл TA0CCR2 = 0x1000; // начало ШИМ TA0CTL = TASSEL_2 + MC_1; // счет до CCR0, тактирование от SMCLK //инициализация АЦП // в качестве ИОН используем VEref+ и VEref- // 16 x ADC10CLKs (выборка за 16 тактов), включаем АЦП. ADC10CTL0 = SREF_6 + ADC10SHT_3 + ADC10ON + ADC10IE + MSC; // Вход A5, делитель ADC10CLK на 1, циклический одноканальный режим. ADC10CTL1 = INCH_5 + SHS_0 + ADC10SSEL_0 + ADC10DIV_0 + CONSEQ_0; ADC10CTL0 |= ENC; // Разрешаем преобразования. need=0x100;//начальное значение угла поворота lastp=0;//буфер для запрета повтора вывода данных rxb=0;//буфер для ввода данных while(1) { ADC10CTL0 |= ADC10SC;//начинаем новое преобразование _BIS_SR(CPUOFF+GIE);//убиваем процессор, разрешив прерывания //следующий код выполняется после включения процессора if((ADC10MEM>(need-2))&&(ADC10MEMneed)//если считанное значение больше нужного { P2OUT=0x02;//крутим в одну сторону TA0CCR2=0xB00+(ADC10MEM-need)*5; } else if(ADC10MEM12); x=x='0')&&(UCA0RXBUF

Просмотров работы: 784