Forum: Mikrocontroller und Digitale Elektronik STM32 GPIO-Geschwindigkeit


von Samuel (Gast)


Angehängte Dateien:

Lesenswert?

hallo zusammen,

ich muss eine Pulse mit sehr enger und unterschiedliche Breite erzeugen. 
Die Einstellung und Vorgehensweise ist wie folgt:

Clock freq= 16 Mhz, Prescaler=1. Aus_zeit soll 15 µs sein, daraus folgt 
= 15µs*16MHz/2=120. Dafür habe ich an Timer gedacht und mit dieser Logic 
für bestimmte Zeit an und ausschalten. Leider sieht es aus, dass 
manchmal Flanken nicht fallen können. Obwohl ichmit Cubemx die maximale 
Outputgeschwindigkeit in der GPIO-Konfiguration auf very high gesetzt 
habe. habt ihr vorschläge ?


Vielen Dank

von Harry L. (mysth)


Lesenswert?


von Samuel (Gast)


Lesenswert?

danke aber das hilft mir nicht. trotzdem werde ich das durchlesen.
weil ich versucht habe, die ARR eines PWM-Signales zu ändern, jedoch 
ohne Erfolg.

von C. W. (chefkoch)


Lesenswert?

Wenn es nur Pulspakete sein sollen wären evtl. entsprechende Bitmuster 
per SPI eine Lösung.

von Mister_X (Gast)


Lesenswert?

Samuel schrieb:
> danke aber das hilft mir nicht. trotzdem werde ich das durchlesen.
> weil ich versucht habe, die ARR eines PWM-Signales zu ändern, jedoch
> ohne Erfolg.

Ja, weil du keine Ahnung hast was eine PWM ist und wie ein Timer 
funktioniert.

Stelle den Prescaler auf 1, Periode auf 480, No Division, Pulse 240
dann gehts.
Und lerne zuerst einmal was ein PWM Signal ist.

von Mister_X (Gast)


Lesenswert?

C. W. schrieb:
> Wenn es nur Pulspakete sein sollen wären evtl. entsprechende
> Bitmuster
> per SPI eine Lösung.

er möchte das aber mit dem Timer machen.

von Harry L. (mysth)


Lesenswert?

Samuel schrieb:
> danke aber das hilft mir nicht.

Doch, genau DAS willst du!

Kapitel 5: Arbitrary waveform generation using timer DMA-burst feature.

von Samuel (Gast)


Lesenswert?

C. W. schrieb:
> Wenn es nur Pulspakete sein sollen wären evtl. entsprechende Bitmuster per SPI 
eine Lösung.

DAS habe ich probiert. Aber es ging nicht. Weil es immer feste low 
interval gibt. und die Daten werden je nach der Zeit zwischen 2 
fallenden Flanken gemmesen und dementsprechend decodieren.

LG

von Samuel (Gast)


Angehängte Dateien:

Lesenswert?

sowas bruache ich zu erzeugen. siehe Bild

von Samuel (Gast)


Lesenswert?

void LED(){

Wert=  __HAL_TIM_GetCounter(&htim3);

    if(Wert> 0 && Wert<120){
    HAL_GPIO_WritePin(GPIOE,GPIO_PIN_15,GPIO_PIN_RESET);
    }
    else if (Wert> 120 && Wert<= 1392){
    HAL_GPIO_WritePin(GPIOE,GPIO_PIN_15,GPIO_PIN_SET);     // Sync 58 
Tcik
    }

    else if (Wert> 1392 && Wert<= 1512){
    HAL_GPIO_WritePin(GPIOE,GPIO_PIN_15,GPIO_PIN_RESET);
    }
    else if (Wert> 1512 && Wert<= 1704){
    HAL_GPIO_WritePin(GPIOE,GPIO_PIN_15,GPIO_PIN_SET);   // 13 tick 
Status
    }
    else if (Wert> 1704 && Wert<= 1824){
    HAL_GPIO_WritePin(GPIOE,GPIO_PIN_15,GPIO_PIN_RESET);
    }
    else if (Wert> 1824 && Wert<= (2024)){
    HAL_GPIO_WritePin(GPIOE,GPIO_PIN_15,GPIO_PIN_SET);   // 26 tick 
data1
    }


      else{
    HAL_GPIO_WritePin(GPIOE,GPIO_PIN_15,GPIO_PIN_RESET);
    }

  }

von Samuel (Gast)


Lesenswert?

Harry L. schrieb:
> Samuel schrieb:
>> danke aber das hilft mir nicht.
>
> Doch, genau DAS willst du!
>
> Kapitel 5: Arbitrary waveform generation using timer DMA-burst feature.

anscheinend hast recht. melde mich, wenn es klappt.

von Samuel (Gast)


Angehängte Dateien:

Lesenswert?

hallo zusammen,

ich habe es jetzt mit arbitrary waveform. Aber es hat nicht geklappt. 
ich denke, dass es an der Konfiguration liegt, weil ich register 
programmiereung nicht kann.Ich habe ein Array von 6 Words erstellt, 
damit zwei Wellenformmuster an TIM2-Kanal 1 gesendet werden können 
(TIM2_ARR, TIM2_RCR, TIM2_CCR1).

uint32_t aSRC_Buffer [6] = {2000,1,800,3000,2,200}; /// ARR, RCR, CCR1 x 
2. trotzdem sehe ich kein Signal mit dem Oszi ausser ein Signal wegen 
der folgenden Function HAL_TIM_PWM_Start (& htim2, TIM_CHANNEL_1);
Zusammenfassung der Konfiguration:

Timer clock =64 MHz
clock source: internal
PWM Generation CH1
Prescaler=64
counter mode =Up
period= 50000


– Pin PA8: TIM2_ch1_output
– Mode: push pull
– Pull: pull-up
– Speed: high



uint32_t aSRC_Buffer[6] = { 2000,1,800,3000,2,200}; //ARR, Häufigkeit, 
CCR

  /* USER CODE BEGIN 2 */
//HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
HAL_TIM_DMABurst_WriteStart(&htim2,TIM_DMABASE_ARR, TIM_DMA_TRIGGER,
(uint32_t *)aSRC_Buffer, TIM_DMABURSTLENGTH_3TRANSFERS);
  /* USER CODE END 2 */

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.