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

 
 
> 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

Сообщений в этой теме
- 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
- - a-6539x   скорей всего это из-за ошибки в комментарии строки...   Apr 18 2011, 17:22
|- - _Pasha   Цитата(a-6539x @ Apr 18 2011, 20:22)...   Apr 18 2011, 18:24
- - 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 Текстовая версия Сейчас: 24th June 2025 - 23:37
Рейтинг@Mail.ru


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