реклама на сайте
подробности

 
 
> MC3PHAC+AVR, установка связи AVR c MC3PHAC поUART
a-6539x
сообщение Jan 30 2011, 09:38
Сообщение #1





Группа: Новичок
Сообщений: 9
Регистрация: 20-10-10
Пользователь №: 60 297





Выкладываю драйвер для связи MC3PHAC и AVR



//***************************************************

// Драйвер управления MC3PHAC по UART *

// V1.0 30.01.2011 *

//***************************************************

//CodeVisionAVR V 2.03.4 Standart






//********************** UART ************************

#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)

#define RX_BUFFER_SIZE 64

#define TX_BUFFER_SIZE 64

char rx_buffer[RX_BUFFER_SIZE];

char tx_buffer[TX_BUFFER_SIZE];

unsigned char tx_wr_index,tx_rd_index,tx_counter=0;

unsigned char rx_wr_index=0,rx_rd_index,rx_counter=0;

bit rx_buffer_overflow;

// инициализация UART

void USART_init(){

UCSRA=0x00;

UCSRB=0xD8;

UCSRC=0x86;

UBRRH=0x00;

UBRRL=0x19;

}

// 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;

};

};

}

// 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;

};

}

// загрузить байт в буфер для последующей передачи

char getbyte(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;

}

// выгрузить из буфера байт

void putbyte(unsigned 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")

}

//****************************************************









//**** Команды управления контроллером MC3PHAC ********

// 3.5В(зн.АЦП=717) на выводе DC_bus принято за 100% (310В) напряжения питания инвертора

unsigned char const cmd_RESET[5] = {0xE3, 0x10, 0x00, 0x30, 0x00};

unsigned char const cmd_PPWM[5] = {0xE3, 0x10, 0x00, 0x50, 0x00};

unsigned char const cmd_DEADT[5] = {0xE3, 0x00, 0x36, 0x24, 0x00}; // 4.5 мкс мертвое время

unsigned char const cmd_ACB[5] = {0xE3, 0x10, 0x00, 0x61, 0x00}; // 50 Гц базовая частота

unsigned char const cmd_ACC[5] = {0xE4, 0x00, 0x60, 0x05, 0x00}; // 5 Гц/c ускорение

unsigned char const cmd_F[5] = {0xE4, 0x00, 0x62, 0x06, 0x80}; // 6.5 Гц задание синусоидальной частоты

unsigned char const cmd_FPWM[5] = {0xE3, 0x10, 0x00, 0x42, 0x00}; //10.6 кГц частота ШИМ

unsigned char const cmd_VBOOST[5] = {0xE3, 0x00, 0x6C, 0x00, 0x00}; // 0 % амплитуда синуса при нулевой синусоидальной частоте

unsigned char const cmd_MODIN[5] = {0xE3, 0x00, 0x75, 0xFE, 0x00}; // 99 % индекс модуляции синуса (амплитуда)

unsigned char const cmd_FTOUT[5] = {0xE4, 0x00, 0x6A, 0x00, 0x05}; // 1.3 c таймаут после аварии

unsigned char const cmd_VBDEC[5] = {0xE4, 0x00, 0xC9, 0x03, 0x55}; // 119 % значение Vbus при котором начинается снижение скорости торможения

unsigned char const cmd_VBRAKE[5] = {0xE4, 0x00, 0x64, 0x03, 0x55}; // 119 % значение Vbus при котором появляется сигнал вкл. тормозного VT

unsigned char const cmd_VBROWN[5] = {0xE4, 0x00, 0x66, 0x01, 0xF6}; // 71 % нижнее значение Vbus при откл. ШИМ и появляется сигнал аварии

unsigned char const cmd_VBOVR[5] = {0xE4, 0x00, 0x68, 0x03, 0x71}; // 123 % верхнее значение Vbus при откл. ШИМ и появляется сигнал аварии

unsigned char const cmd_FORW[5] = {0xE3, 0x10, 0x00, 0x10, 0x00}; // "вперед"

unsigned char const cmd_REW[5] = {0xE3, 0x10, 0x00, 0x11, 0x00}; // "назад"

unsigned char const cmd_STOP[5] = {0xE3, 0x10, 0x00, 0x20, 0x00}; // "стоп"

unsigned char const read_ACTF[3] = {0xD1, 0x00, 0x85}; // прочитать текущюю синусоидальную частоту

unsigned char const read_SETUP[3] = {0xD0, 0x00, 0xAE}; // прочитать регистр установок

unsigned char const read_VBUS[3] = {0xD1, 0x00, 0x79}; // прочитать напряжение питания инвертора (DC_bus)

unsigned char const read_F[3] = {0xD1, 0x00, 0x62}; // прочитать задание на синусоидальную частоту

unsigned char const read_STATUS[3] = {0xD0, 0x00, 0xC8}; // прочитать регистр статуса

//******************************************************





//***************** Процедуры **************************

// посылка команды

void MC3PHAC_Send(flash unsigned char *msg,unsigned char len){

unsigned char CRC=0;

putbyte(0x2B);

while(len>0){

if(*msg==0x2B){putbyte(0x2B);} // повторить байт

putbyte(*msg);

CRC+=*msg;

*msg++;

len--;

}

putbyte((unsigned char)(~CRC+1));

delay_ms(40);

}

// прием ответа типа Word (формат ответа: 2B_00_Hi_Lo_CRC)

unsigned int RxWord(){

unsigned char CRC,Lo,Hi;

unsigned int data=0;

getbyte(); //2B

CRC=getbyte(); //00

Hi=getbyte();CRC+=Hi; //Hi

if(Hi==0x2B){getbyte();}//пропустить байт подтверждения

Lo=getbyte();CRC+=Lo; //Lo

if(Lo==0x2B){getbyte();}//пропустить байт подтверждения

data=Hi;

data<<=8;

data+=Lo;

while((~CRC+1)!=getbyte()){} //CRC

return data;

}

// прием ответа типа Byte (формат ответа: 2B_00_Lo_CRC)

unsigned char RxByte(){

unsigned char CRC,Lo;

getbyte(); //2B

CRC=getbyte(); //00

Lo=getbyte();CRC+=Lo; //Lo

while((~CRC+1)!=getbyte()){} //CRC

return Lo;

}

// Прием ответа на команду (формат ответа: 2B_Lo_CRC)

unsigned char Response(){

unsigned char CRC,Lo;

getbyte(); //2B

Lo=getbyte(); //Lo

CRC=Lo;

while((~CRC+1)!=getbyte()){} //CRC

return Lo;

}

// идентификация MC3PHAC

void MC3PHAC_Identification(){

unsigned char i,j;

unsigned char Test_Link1[3] = {0x2B,0xC0, 0x40};

for (j=0; j<3;j++){

for (i=0;i<3;i++){

putbyte(Test_Link1[i]);

}

while(Response()!=0x81){}

}

}

// иницилизация MC3PHAC

void MC3PHAC_Init(){

MC3PHAC_Send(cmd_RESET, sizeof(cmd_RESET));

delay_ms(100);

MC3PHAC_Send(cmd_DEADT, sizeof(cmd_DEADT));

Response();

MC3PHAC_Send(cmd_PPWM, sizeof(cmd_PPWM));

Response();

MC3PHAC_Send(cmd_ACB, sizeof(cmd_ACB));

Response();

MC3PHAC_Send(cmd_ACC, sizeof(cmd_ACC));

Response();

MC3PHAC_Send(cmd_FPWM, sizeof(cmd_FPWM));

Response();

MC3PHAC_Send(cmd_F, sizeof(cmd_F));

Response();

MC3PHAC_Send(cmd_VBOOST, sizeof(cmd_FPWM));

while(Response()!=0x00){}

MC3PHAC_Send(cmd_MODIN, sizeof(cmd_MODIN));

while(Response()!=0x00){}

MC3PHAC_Send(cmd_FTOUT, sizeof(cmd_FTOUT));

while(Response()!=0x00){}

MC3PHAC_Send(cmd_VBDEC, sizeof(cmd_VBDEC));

while(Response()!=0x00){}

MC3PHAC_Send(cmd_VBRAKE, sizeof(cmd_VBRAKE));

while(Response()!=0x00){}

MC3PHAC_Send(cmd_VBROWN, sizeof(cmd_VBROWN));

while(Response()!=0x00){}

MC3PHAC_Send(cmd_VBOVR, sizeof(cmd_VBOVR));

while(Response()!=0x00){}

}

//******************************************************













Пример основной программы в которую подгружается драйвер

примечание : при отсутствии связи (ошибке ответа) прога заходит в бесконечный цикл while(1){}

#include <mega16.h>


#include <delay.h>
#include <stdio.h>

//************** Глобальные переменные *************

unsigned int period,timer;
unsigned int f;
unsigned int zad_f;
unsigned int voltage_bus;
bit PUSK=0;
unsigned char status;
//**************************************************

#include "driver_mc3phac.h"

void init(){
PORTC=0b00000000;
DDRC= 0b11111111;
PORTD=0b00001000;
DDRD= 0b10001000;
PORTA=0b00111100;
DDRA= 0b11111100;
PORTB=0b00000000;
DDRB= 0b00000000;
// и т.д и т.п.
}

void main(void){
init();
USART_init();
#asm("sei")
delay_ms(1000);
MC3PHAC_Identification();
MC3PHAC_Init();
MC3PHAC_Send(read_SETUP,sizeof(read_SETUP));
while(RxByte()!=0xFF){} // проверка готовности перед включением ШИМ

while (1){
MC3PHAC_Send(cmd_FORW,sizeof(cmd_FORW)); // включение двигателя вперед
Response();


MC3PHAC_Send(read_ACTF,sizeof(read_ACTF)); // пример чтения текущей синусоидальной частоты
f=RxWord();


}


}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
a-6539x
сообщение Apr 18 2011, 17:22
Сообщение #2





Группа: Новичок
Сообщений: 9
Регистрация: 20-10-10
Пользователь №: 60 297



скорей всего это из-за ошибки в комментарии строки инициалицации ускорения. Значение следует выбирать из диапазона 0..7FFF а не 0..FFFF. Напиши:

xdata unsigned char const cmd_ACC[5] = {0xE4, 0x00, 0x60, 0x7F, 0xFF}; // ускорение

Хотя думаю ты уже догодался.

Если двигатель быстро разгоняется, но не так быстро тормозит значит все работает правильно. При торможении особенно под нагрузкой на валу резко поднимается напряжение на шине питания и чтобы недопустить перенапряжения на транзисторах и электролитах MC3PHAC начинает снижать скорость торможения на сколько это необходимо. Поэтому резкое торможение получить будет сложно конечно если не поставить мощный тормозной резистор. Включение тормозного резистора должно происходить немного раньшше чем снижение ускорения (reduced deceleration) или одновременно (как я понял).

Go to the top of the page
 
+Quote Post
_Pasha
сообщение Apr 18 2011, 18:24
Сообщение #3


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(a-6539x @ Apr 18 2011, 20:22) *
если не поставить мощный тормозной резистор.

Могу цифрами помочь: 10 10ваттных резюков впараллель. 4к7.
Лучше на радиатор.

Сообщение отредактировал _Pasha - Apr 18 2011, 18:25
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- a-6539x   MC3PHAC+AVR   Jan 30 2011, 09:38
- - _Pasha   Сделайте в своем сообщении так: весь код заключите...   Jan 30 2011, 15:09
|- - a-6539x   Цитата(_Pasha @ Jan 30 2011, 18:09) Сдела...   Jan 30 2011, 19:48
- - Chip115   Доброго времени суток! В данный момент пишу с...   Feb 26 2011, 15:01
|- - a-6539x   RE: MC3PHAC+AVR   Feb 27 2011, 20:31
|- - Chip115   Цитата(a-6539x @ Feb 28 2011, 03:31)...   Apr 12 2011, 06:23
- - Chip115   Спасибо за такой полный ответ! А если без ...   Mar 18 2011, 19:52
|- - a-6539x   Цитата(Chip115 @ Mar 18 2011, 22:52) Спас...   Mar 23 2011, 05:28
- - MasterWizard   Доброе время. Сломал себе мозг и разочаровался в с...   Oct 7 2012, 13:03
|- - _Pasha   Цитата(MasterWizard @ Oct 7 2012, 16:03) ...   Oct 7 2012, 14:21
|- - MasterWizard   Цитата(_Pasha @ Oct 7 2012, 18:21) У меня...   Oct 7 2012, 14:38
|- - _Pasha   Цитата(MasterWizard @ Oct 7 2012, 17:38) ...   Oct 7 2012, 15:46
|- - MasterWizard   Цитата(_Pasha @ Oct 7 2012, 19:46) Перепу...   Oct 7 2012, 21:40
|- - _Pasha   Цитата(MasterWizard @ Oct 8 2012, 00:40) ...   Oct 8 2012, 04:29
|- - MasterWizard   Цитата(_Pasha @ Oct 8 2012, 08:29) Начну ...   Oct 8 2012, 05:39
|- - _Pasha   Цитата(MasterWizard @ Oct 8 2012, 08:39) ...   Oct 8 2012, 08:19
- - MasterWizard   Все страньше и страньше. Прокинул аналоговую землю...   Oct 10 2012, 07:23
- - Agent 007   Всем привет. У меня противоположная проблема. Ника...   Mar 21 2013, 21:42


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th June 2025 - 06:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01471 секунд с 7
ELECTRONIX ©2004-2016