Jump to content
ELFORUM - Forumul electronistilor
PKP98

STM32F103C8 iesirea nu sta pe HIGH

Recommended Posts

Buna ziua! 

Am si eu o problema ciudata pentru mine si poate logica pentru altii. Folosesc un STM32F103C8 pentru comanda unui invertor trifazat. Comand un circuit integrat IXDP630, cel din imaginea urmatoare.

image.thumb.png.4280f01d26d1812914cbcf4f836ecd42.png

 

In primele teste am legat toti pinii (ENAR, ENAS, ENAT, OUTENA,RESET la 1 logic (5v)) si am comandat direct din STM pinii (DATA IN R, DATA IN S, DATA IN T), adica cele trei faze. Am verificat inainte daca circuitul IXDP630 citeste valoarea de 3.3V de la iesirea STM-ului ca 1 logic, o face. Am generat cu ajutorul unui timer 3 semnale SPWM defazate la 120 si invertorul merge perfect.

Pasul urmator a fost implementarea unei protectii la scurtcircuit si suprasarcina pe iesire. Un sunt pus pe ramura negativa a alimentarii invertorului, cu un comparator si un optocuplor care declanseaza o intrerupere la STM. Protectia este destul de rapida, timp de raspuns mai mic de 10us. Initial aceasta protectie taia semnalele (DATA IN R, DATA IN S, DATA IN T) fix in rutina de intrerupere, astfel tranzistorii de putere nu mai erau comandati. Armarea se facea automat dupa 3 secunde. Totul functiona perfect, neasteptat de bine.

 

Problema apare abia acum....vreau ca in rutina de intrerupere sa pun pe 0 logic pinul OUTENA de la IXDP630, acest lucru ar pune pe 0 logic toate iesirile (RU, RS.....). Asa ca am folosit un pin de la STM (PB13) pe care l-am initializat asa:

RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;	
  GPIOB->CRH |=(GPIO_CRH_MODE13_1|GPIO_CRH_MODE13_0);
  GPIOB->CRH &=~(GPIO_CRH_CNF13_1|GPIO_CRH_CNF13_0);

  GPIOB->ODR |=GPIO_ODR_ODR13;

Push-pull la viteza maxima 50MHz. Am conectat OUTENA la acest pin si am pornit testul. Problema este ca acest pin nu trece pe 1 logic atunci cand este conectat la OUTENA. De exemplu, daca pun un LED pe el, pinul trece si pe 1 logic si pe 0 logic, adica functioneaza. Cum conectez OUTENA la pin....acesta ramane pe 0 logic tot timpul. Am deconectat OUTENA si l-am pus la 3,3V si invertorul merge perfect. L-am pornit asa(pinul OUTENA la 3.3V, iar pinul PB13 fiind in gol, a trecut pe 1 logic) si dupa am pus pinul OUTENA la PB13 si invertorul a continuat sa mearga, deci pinul PB13 a ramas pe 1 logic. Am facut un scurt pe iesire, protectia a mers...pinul PB13 a sarit pe 0 logic, dar dupa cele 3 secunde in care porneste automat, adica pinul PB13 il fac din soft 1 logic...acesta ramane tot pe 0, orice as face. Am incercat si cu un tranzistor, am crezut ca pinul OUTENA are nevoie de mai mult curent decat poate oferii STM pe acel pin, am incercat si cu un 74hc14, dar nu vrea....nu trece pe 1 logic...trece pe 1 logic doar daca la el am conectat orice altceva in afara de OUTENA. Am facut si o captura, unde se poate observa ca acesta tinde sa se faca 1 logic, dar dupa 3.5us se face 0 logic...nu mai inteleg nimic. 

DS1Z_QuickPrint1.thumb.png.59bc06688a096b9322e752dd69dcb43f.png

In codul de mai jos este tot ceea ce se afla in while(1) :

  if(Output_Fault==true)
	  {
		  LCD_2X16_Clear();
		  LCD_2X16_Set_Cursor(0,0);
		  LCD_2X16_Message("Status: STOP");
		  LCD_2X16_Set_Cursor(0,1);
		  LCD_2X16_Message("Short Circuit !");
		  HAL_Delay(2000);
		  LCD_2X16_Clear();
		  LCD_2X16_Set_Cursor(0,0);
		  LCD_2X16_Message("Status: STARTING");
		  Output_Amplitude=0;
		  GPIOB->ODR |=GPIO_ODR_ODR13;
		  Soft_Start(Soft_Start_Time);
		  Output_Fault=false;
		  LCD_2X16_Clear();
		  LCD_2X16_Set_Cursor(0,0);
		  LCD_2X16_Message("Status: RUN");
	  }

Iar asta este rutina de intrerupere:

void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin)
{
 if	(GPIO_Pin == SC_Pin )
 {
	 GPIOB->ODR &=~GPIO_ODR_ODR13;
	 Output_Fault=true;
	Output_Amplitude=0;
 }

}

Nu stiu ce are si de ce nu vrea, ma gandesc ca este ceva tot din soft, nu am intializat corect acel pin de iesire PB13, dar de ce cu un LED merge perfect?

De ce sta 3.5us pe 1 logic si apoi sare la 0 logic ? 

Astept cu nerabdare un raspuns, deja pentru mine este mult prea ciudat.

Link to comment
Share on other sites

Acum 31 minute, Liviu M a spus:

Ești sigur că nu mai ai "condiții de scurt"?

Pune și intrarea cu întrerupere pe osciloscop.

Acesta este raspunsul, apare un fel de oscilatie de la protectia pentru scurtcircuit dupa 2us de la activarea pinului PB13, plus 1.5us cat dureaza sa intre in intrerupere si sa seteze pinul din nou pe 0 logic, deci de acolo cele 3.5us. 

DS1Z_QuickPrint2.thumb.png.a3846cfea394d5ab33d9219c861e2dd3.png

Cu galben este pinul PB13 si cu albastru semnalul de la protectie, deci este clar! 

Acum 39 minute, Liviu.Mihaiu a spus:

Posibil ca intreruperea sa se repete (semnalul care o genereaza sa nu fie curat)
Incearca
if (GPIO_Pin == SC_Pin && !Output_Fault)

Si asa am rezolvat problema, acum merge foarte bine. Oricum sunt pe cablaje de teste momentan, iar STM-ul este pe un breadboard separat, de aici si acele oscilatii. Acesta este proiectul meu de diploma: un invertor trifazat cu comanda SPWM, sinus pur la iesire, de la 24VCC la 3x230VAC si o putere activa maxima de 800W, dar maxim 800W, ma multumesc si cu 200W pentru inceput. 

Nu stiu cum nu m-am gandit sa monitorizez si semnalul de la protectia de la scurtcircuit, eram aproape sigur ca nu de acolo este problema. 

@Liviu M @Liviu.Mihaiu va multumesc foarte frumos, sunteti cei mai tari! Pana ma prindeam eu care este problema...mai dura ceva timp :)))

 

Link to comment
Share on other sites

Cum este configurat (si cine este) pinul SC?

Unde ai configurat (si cum este configurat) NVIC pentru executarea intreruperii EXTI generata de pinul SC?

Trebuie neaparat sa scrii programul folosindu-te de registri? Sau poti folosi si Standard Peripheral Library/HAL library?

Edited by nico_2010
Link to comment
Share on other sites

Acum 15 ore, Liviu M a spus:

Eu presupun că "zgomotul" de pe oscilogramă se datorează unei comutari. M-aș uita cu osciloscopul și la ieșiri. 

Astăzi am timp și o sa mai fac niste teste, ceva nu este normal, el merge bine, adică as putea sa îl las așa, dar parca nu îmi vine :))

Acum 7 minute, nico_2010 a spus:

Cum este configurat (si cine este) pinul SC?

Unde ai configurat (si cum este configurat) NVIC pentru executarea intreruperii EXTI generata de pinul SC?

Trebuie neaparat sa scrii programul folosindu-te de registri? Sau poti folosi si Standard Peripheral Library/HAL library?

Folosesc STM32IDE și STM32CubeMX, pinul SC este configurat in CubeMx, tot acolo am configurat și timer ul pentru pentru generarea SPWM. Restul (GPIO, I2C) sunt configurate manual, fara cod generat.

Pot sa folosesc și HAL, nu îmi este impus nimic! Prefer sa le fac manual, adică o sa rezulte proiectul meu de diplomă, dar nu vreau sa îl fac doar ca sa scap, sincer...nici nu prea mă interesează nota, de când cu pandemia asta...s a cam dus totul! O sa trec pe inițializare manuală și timer ul și întreruperea, dar asta treptat. Plus că acest mod o sa mă ajute sa scriu și câte ceva despre STM ul folosit și despre cum am setat registrii lui. 

Momentan nu am la dispoziție laptopul pe care lucrez la acest proiect, o sa postez mai multe imediat ce ajung la el. 

Va mulțumesc foarte mult pentru interes și ajutor! 

Link to comment
Share on other sites

Pare OK modul in care ai setat SC. Nu cumva sa intervina intreruperea TIM2 peste intreruperea generata de nivelul 1 logic pe pinul SC, caz in care aceasta intrerupere nu este activa (este amanata, in functie de nivelul de prioritate al celei din urma).

L.E.: Din ce am vazut prioritate are EXTI3 (intreruperea generata de semnalul aplicat pe pinul SC) fata de intreruperea generata de TIM2.

Nu am alte idei

Edited by nico_2010
Link to comment
Share on other sites

1 oră în urmă, nico_2010 a spus:

L.E.: Din ce am vazut prioritate are EXTI3 (intreruperea generata de semnalul aplicat pe pinul SC) fata de intreruperea generata de TIM2.

Asta cautam si eu, dar mai greu la mine, multumesc foarte frumos pentru informatie. Sigur se intampla ceva pe acolo, o sa mai analizez putin si dupa regandesc de la 0 toata logica, sigur imi scapa ceva, mai ales ca abia am inceput cu STM32 .

 

Va multumesc pentru ajutor si implicare!

Link to comment
Share on other sites

Un sfat: pentru inceput foloseste HAL library. Este mai simplu pentru teste si mai intuitiv de inteles. Dupa ce obtii functionarea in modul dorit studiaza librariile perifericelor (disponibile in folderul HAL Driver) si de acolo poti seta registrii asa cum ai nevoie.

Edited by nico_2010
Link to comment
Share on other sites

Exact asa am facut pana acum cu I2C si GPIO. 

Acum 50 minute, nico_2010 a spus:

Dupa ce obtii functionarea in modul dorit studiaza librariile perifericelor (disponibile in folderul HAL Driver) si de acolo poti seta registrii asa cum ai nevoie.

Asa o sa fac in continuare!

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines