Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2014:motor-ncv70514

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revize Předchozí verze
Následující verze
Předchozí verze
2014:motor-ncv70514 [2015/01/18 22:14]
Jan Hořák
2014:motor-ncv70514 [2015/01/18 23:02] (aktuální)
Jan Hořák [ZAVĚR]
Řádek 22: Řádek 22:
  
 ===== CODE ===== ===== CODE =====
-Ke způsobu komunikace s mikrokontrolérem ​jsem využil virtuální COM port vytvořený v programu STMCubeMX. K jeho rozchození je nutné si nainstalovat ovladače od výrobce a v souboru startup_stm34f429xx.s upravit údaj Heap_Size na     ​400.+Kod tohoto projektu jsem rozdělil na část v počítači a část v mikrokontroléru STM32F429. K propojení mezi těmito zařízeními ​jsem použil virtuální COM port vytvořený v programu STMCubeMX. K jeho rozchození je nutné si nainstalovat ovladače od výrobce a v souboru startup_stm34f429xx.s upravit údaj Heap_Size na 400.
 ==== MATLAB ==== ==== MATLAB ====
 V počítači jsem si vytvořil program na pro, kde je možné řídit komunikaci a zobrazit údaje v jednotlivých registrech. Jeho fotku a část výpisu kódu vidíme níže. V počítači jsem si vytvořil program na pro, kde je možné řídit komunikaci a zobrazit údaje v jednotlivých registrech. Jeho fotku a část výpisu kódu vidíme níže.
-{{:​2014:​motor-ncv70514:​matlab.png?​400| }} 
  
 +{{ :​2014:​motor-ncv70514:​matlab.png?​400| }}
 +<code c>
 +function Button_step1_Callback(hObject,​ eventdata, handles)
 +global s %global seriovka
  
 +if (get(handles.Button_step1,'​value'​))
 +    fprintf(s,'​STEP1_SET'​);​
 +else
 +    fprintf(s,'​STEP1_CLR'​);​
 +end
  
 +function Button_rhb_Callback(hObject,​ eventdata, handles)
  
 +if (get(handles.Button_rhb,'​value'​))
 +    fprintf(s,'​RHB_SET'​);​
 +else
 +    fprintf(s,'​RHB_CLR'​);​
 +end
 +
 +
 +function Button_send_Callback(hObject,​ eventdata, handles)
 +
 +global s
 +text1=get(handles.edit_ACR1,'​string'​);​ % vyčtení hodnoty adresy pro data
 +disp(text1(1:​3)); ​                        
 +Data_Adress=AdressHex(text1(1:​3)); ​      ​%volani fnc pro prevod adress
 +text2=get(handles.edit_ACR2,'​string'​);​ % vyčtení hodnoty adresy pro čteni
 +disp(text2(1:​3)); ​    
 +Read_Adress=AdressHex(text2(1:​3)); ​      ​%Volani fnc pro prevod adress
 +Data_Value = str2double(get(handles.edit_data,'​String'​)); ​
 +Adress=((Data_Adress*16)+Read_Adress);​
 +%disp([Adress,​Data_Value])
 +fprintf(s,​[Adress,​Data_Value]);​
 +Data_In = fscanf(s,'',​2);​ % nacteni dvou hodnot
 +disp(Data_In)
 +
 +Table_temp=get(handles.Table1,'​data'​);​
 +Temp1=rot90(de2bi(Data_In(1),​8));​ % ohlasi chybu pokud nedojdou data, nutno 8 pozic jinak nefunguje pridani do tabulky
 +Temp2=rot90(de2bi(Data_In(2),​8));​ % ohlasi chybu pokud nedojdou data, de2bi vyrvari sloupec->​rot90 do rady
 +disp(Temp1);​
 +disp(Temp2);​
 +Table_temp(Data_Adress)=Temp1;​
 +Table_temp(Read_Adress)=Temp2;​
 +set(handles.Table1,'​data',​Table_temp);​
 +</​code>​
 ==== ARM ==== ==== ARM ====
 +Hlavní části programu nahraného do ARM jsou obsluha přerušení v případě přijetí dat po seriové lince a samotná hlavní smyčka programu. Všechny proměnné v hlavní smyčce jsou označené jako globální, proto je možné je použít i v dalších knihovnách.
  
 +První část kódu je obsluha přerušení,​která se nachází v obsluze přerušení pro přijeti dat po seriové lince. Prvně dojde k načtení do registru buff_RX. Kdy se podle délky obsažené zprávy rozhoduje jestli se jedná o příkazy pro řídící piny, nebo data přímo do NCV70514.
  
 +<code c>
 +int i = 0;
 +
 + USBD_CDC_SetRxBuffer(&​hUsbDeviceHS,​ &​buff_RX[0]);​
 +                USBD_CDC_ReceivePacket(&​hUsbDeviceHS);​
 +
 + if (buff_RX[5]==0) //rozdeleni mezi COMMAND a daty do NCV70514
 + {
 + for (i = 0; i < 4; i++){
 +    buff_TX[i] = buff_RX[i]; //nacteni poslanych dat do echa
 + TX[i] = buff_RX[i];​} //nacteni dat do TX_SPI
 + }
 + else
 + {
 + for (i = 0; 0!=buff_RX[0];​ i++)
 + {
 + COMMAND[i]=buff_RX[i];​
 + }
 + }
 +</​code>​
 +
 +V samotném hlavním programu dochází k inicializaci všech použitých periferií a čekání na následný stisk tlačítka.
 +Po stisku přejde program do nekonečné smyčky, kdy jsou kontrolovány registry pro příjem a na základě uložených dat do nich jsou buď odeslány po SPI sběrnici dál, případně dojde k nastavení požadovaného pinu.
 +<code c>
 + uint8_t TX[4];
 + uint8_t RX[4];
 + uint8_t buff_RX[256];​
 +        uint8_t buff_TX[256];​
 + char COMMAND[50];​
 +
 + int i = 0;
 +
 +int main(void)
 +{
 +
 +  SystemClock_Config();​
 +
 +  /* Initialize all configured peripherals */
 +  MX_GPIO_Init();​
 +  MX_ADC1_Init();​
 +  MX_SPI4_Init();​
 +  MX_TIM2_Init();​
 +  MX_USB_DEVICE_Init();​
 +
 + 
 + while(HAL_GPIO_ReadPin(GPIOA,​GPIO_PIN_0)==0);​ //cekani na stisk tlacitka
 + while(HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_0));​
 + HAL_GPIO_TogglePin (GPIOG, GPIO_PIN_14);​
 +
 +  while (1)
 +  {
 + ////////////////////////////////////////////////////​
 + /*             Obsluha Comand ​                */
 + ////////////////////////////////////////////////////​
 +    if (strcmp(COMMAND,​ "​KROK_SET"​) == 0) 
 + {
 +   HAL_GPIO_WritePin(GPIOB,​ GPIO_PIN_4,​GPIO_PIN_SET);​
 + }
 + else if (strcmp(COMMAND,​ "​KROK_CLR"​) == 0) 
 + {
 +   HAL_GPIO_WritePin(GPIOB,​ GPIO_PIN_4,​GPIO_PIN_RESET);​
 + }
 + else if (strcmp(COMMAND,​ "​SMER_SET"​) == 0) 
 + {
 +   HAL_GPIO_WritePin(GPIOB,​ GPIO_PIN_3,​GPIO_PIN_SET);​
 + }
 + else if (strcmp(COMMAND,​ "​SMER_CLR"​) == 0) 
 + {
 +   HAL_GPIO_WritePin(GPIOB,​ GPIO_PIN_3,​GPIO_PIN_RESET);​
 + }
 + else if (strcmp(COMMAND,​ "​STEP0_SET"​) == 0) 
 + {
 +   HAL_GPIO_WritePin(GPIOD,​ GPIO_PIN_7,​GPIO_PIN_RESET);​
 + }
 + else if (strcmp(COMMAND,​ "​STEP0_CLR"​) == 0) 
 + {
 +   HAL_GPIO_WritePin(GPIOD,​ GPIO_PIN_7,​GPIO_PIN_RESET);​
 + }
 + else if (strcmp(COMMAND,​ "​STEP1_SET"​) == 0) 
 + {
 +   HAL_GPIO_WritePin(GPIOG,​ GPIO_PIN_9,​GPIO_PIN_RESET);​
 + }
 + else if (strcmp(COMMAND,​ "​STEP1_CLR"​) == 0) 
 + {
 +   HAL_GPIO_WritePin(GPIOG,​ GPIO_PIN_9,​GPIO_PIN_RESET);​
 + }
 + else if (strcmp(COMMAND,​ "​RHB_SET"​) == 0) 
 + {
 +   HAL_GPIO_WritePin(GPIOD,​ GPIO_PIN_5,​GPIO_PIN_RESET);​
 + }
 + else if (strcmp(COMMAND,​ "​RHB_CLR"​) == 0) 
 + {
 +   HAL_GPIO_WritePin(GPIOD,​ GPIO_PIN_5,​GPIO_PIN_RESET);​
 + }
 + else for (i=0;​i<​50;​i++){COMMAND[i]=0;​} //Vymazani pameti
 +
 + ////////////////////////////////////////////////////​
 + /*       Obsluha Data                   */
 + ////////////////////////////////////////////////////​
 +
 + if (TX[0]!=0)
 + {
 + HAL_GPIO_WritePin(GPIOE,​ GPIO_PIN_4,​GPIO_PIN_RESET);​
 + HAL_SPI_TransmitReceive(&​hspi4,&​TX[0],&​RX[0],​2,​20);​
 + HAL_GPIO_WritePin(GPIOE,​ GPIO_PIN_4,​GPIO_PIN_SET);​
 +
 +
 + HAL_GPIO_TogglePin (GPIOG, GPIO_PIN_13);​
 +
 +
 + USBD_CDC_SetTxBuffer(&​hUsbDeviceHS,​ &RX[0], 2);
 +                USBD_CDC_TransmitPacket(&​hUsbDeviceHS);​
 +
 + for (i = 0; i < 4; i++){
 +                RX[i] = 0;
 + TX[i] = 0;}
 + }
 +  }
 +  ​
 +}
 +</​code>​
 ===== ZAVĚR ===== ===== ZAVĚR =====
 +Cílem tohoto projektu bylo čtenáře seznámit se způsoby komunikace s obvodem NCV70514 a jeho propojení s počítačem. V tomto projektu najdete okrajové seznámení se samotným obvodem, způsobem jeho komunikace s okolím a seznámení s jeho vnitřními funkcemi. Vzhledem k specializovanosti samotného obvodu je datasheet nedostupný online. Ke komunikaci jsem vytvořil program v Matlabu pro obsluhu a převodník v ARM. Programem v matlabu je možné řídit jak odesílání dat pro SPI tak i samotné nastavování řídících pinů. V tabulce jdou vidět aktuální hodnoty obsažené v registru NCV70514. Pro vytvořená programu pro STM32F429 jsem použil STM32CubeMX a kód napsal v prostředí Keil 5.
 +
 +
2014/motor-ncv70514.1421615693.txt.gz · Poslední úprava: 2015/01/18 22:14 autor: Jan Hořák