|
MC3PHAC+AVR, установка связи AVR c MC3PHAC поUART |
|
|
|
Jan 30 2011, 09:38
|
Группа: Новичок
Сообщений: 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();
}
}
|
|
|
|
|
 |
Ответов
|
Mar 18 2011, 19:52
|

Участник

Группа: Участник
Сообщений: 43
Регистрация: 28-12-07
Пользователь №: 33 709

|
Спасибо за такой полный ответ! А если без "наворотов" делать... всмысле без проверки CRC и прочей защиты, можно обойтись только инициализацией ? А потом только кидать с MC3PHAC данные и принимать ответ? Мне всего надо несколько комманд: старт,стоп,реверс, частота напряжения на двигателе. В кратце получается Инициализация. 2B E3 10 00 30 00 crc - Сброс ИС MC3PHAC 2B E3 10 00 xx 00 crc - (xx = 50,54,58,5C) Полярность ШИМ выходов. B- T- 2B E3 00 36 xx 00 crc - (xx = 00..FF) Dead time 06*125ns = 750ns 2B E3 10 00 xx 00 crc - (xx = 60,61) Базовая частота двигателя (50Гц) 2B E4 00 60 xx xx crc - (xx xx = 0000..FFFF) Задание ускорения в Hz/sec (7.9 format) 2B E4 00 62 xx xx crc - (xx xx = 0000..7FFF) Задание частоты на двигателе в Hz (8.8 format) 2B E3 10 00 xx 00 crc - (xx = 41,42,44,48) Задание частоты ШИМ 2B E3 00 6C xx 00 crc - (xx = 00..FF) Voltage boost % =знач/FFh (при F=0 на двигателе) 2B E3 00 75 xx 00 crc - (xx = 00..FF) Максимальный индекс модуляции % =знач/FFh 2B E4 00 6A xx xx crc - (xx xx = 0000..FFFF) Fault timeout = знач*0.262с 2B E4 00 C9 xx xx crc - (xx xx = 0000..03FF) напряжение на шине reduced deceleration. 2B E4 00 64 xx xx crc - (xx xx = 0000..03FF) напряжение на шине RBRAKE pin being asserted. 2B E4 00 66 xx xx crc - (xx xx = 0000..03FF) напряжение на шине under voltage fault. 2B E4 00 68 xx xx crc - (xx xx = 0000..03FF) напряжение на шине over voltage fault.
А затем когда нужно, пихаем в него через UART нужные команды 2B E3 10 00 10 00 FD - пуск вперед 2B E3 10 00 11 00 FC - пуск назад 2B E3 10 00 20 00 ED - останов двигателя 2B E4 00 62 xx xx crc - (xx xx = 0000..7FFF) Задание частоты на двигателе в Hz (8.8 format)
на каждую комманду получаем подтверждение. Теоретически при такой структуре будет работать?
|
|
|
|
|
Mar 23 2011, 05:28
|
Группа: Новичок
Сообщений: 9
Регистрация: 20-10-10
Пользователь №: 60 297

|
Цитата(Chip115 @ Mar 18 2011, 22:52)  Спасибо за такой полный ответ! А если без "наворотов" делать... всмысле без проверки CRC и прочей защиты, можно обойтись только инициализацией ? А потом только кидать с MC3PHAC данные и принимать ответ? Мне всего надо несколько комманд: старт,стоп,реверс, частота напряжения на двигателе. В кратце получается Инициализация. 2B E3 10 00 30 00 crc - Сброс ИС MC3PHAC 2B E3 10 00 xx 00 crc - (xx = 50,54,58,5C) Полярность ШИМ выходов. B- T- 2B E3 00 36 xx 00 crc - (xx = 00..FF) Dead time 06*125ns = 750ns 2B E3 10 00 xx 00 crc - (xx = 60,61) Базовая частота двигателя (50Гц) 2B E4 00 60 xx xx crc - (xx xx = 0000..FFFF) Задание ускорения в Hz/sec (7.9 format) 2B E4 00 62 xx xx crc - (xx xx = 0000..7FFF) Задание частоты на двигателе в Hz (8.8 format) 2B E3 10 00 xx 00 crc - (xx = 41,42,44,48) Задание частоты ШИМ 2B E3 00 6C xx 00 crc - (xx = 00..FF) Voltage boost % =знач/FFh (при F=0 на двигателе) 2B E3 00 75 xx 00 crc - (xx = 00..FF) Максимальный индекс модуляции % =знач/FFh 2B E4 00 6A xx xx crc - (xx xx = 0000..FFFF) Fault timeout = знач*0.262с 2B E4 00 C9 xx xx crc - (xx xx = 0000..03FF) напряжение на шине reduced deceleration. 2B E4 00 64 xx xx crc - (xx xx = 0000..03FF) напряжение на шине RBRAKE pin being asserted. 2B E4 00 66 xx xx crc - (xx xx = 0000..03FF) напряжение на шине under voltage fault. 2B E4 00 68 xx xx crc - (xx xx = 0000..03FF) напряжение на шине over voltage fault.
А затем когда нужно, пихаем в него через UART нужные команды 2B E3 10 00 10 00 FD - пуск вперед 2B E3 10 00 11 00 FC - пуск назад 2B E3 10 00 20 00 ED - останов двигателя 2B E4 00 62 xx xx crc - (xx xx = 0000..7FFF) Задание частоты на двигателе в Hz (8.8 format)
на каждую комманду получаем подтверждение. Теоретически при такой структуре будет работать? можно сделать без всех наворотов и проверок (если нет ошибок в программе) главное иметь в виду что при посылке команд тебе сразу же в ответ будет приходить 2B 00 00 (если все хорошо) и тебе надо будет это проигнорировать, чтобы не засорять буфер приема. Я делаю это процедурой Responce(); И тебе все равно в конце каждой команды надо послать ее CRC иначе MC3PHAC ее (команду) не примет
|
|
|
|
Сообщений в этой теме
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 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|