Forum: Mikrocontroller und Digitale Elektronik CH32v003 PWM & Timer Probleme


von Dirk E. (dirk_1980)


Lesenswert?

Hallo,

ich versuche mich gerade an dem ch32v003 Prozessor.
Der läuft intern mit 8Mhz und die eigentliche Anwendung kommt aus einem 
AVR Projekt was hier aber noch nicht arbeitet. Da wird ein Sinus per PWM 
und Timer generiert.

Vielleicht kennt sich jemand damit aus und hat mal Zeit sich das 
anzusehen.



Dabei habe ich 2 Probleme.

- (timer 1) PWM auf Port D3 kommt nicht raus

Irgentwas ist da falsch oder ich sehe es nur nicht.
1
   TIM_Cmd( TIM1, DISABLE );
2
3
   // Enable GPIOC, GPIOD and TIM1
4
   RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD , ENABLE );
5
   RCC_APB2PeriphClockCmd( RCC_APB2Periph_TIM1, ENABLE );
6
7
   // PD3 T1CH4N
8
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
9
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
10
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
11
   GPIO_Init( GPIOD, &GPIO_InitStructure );
12
13
   TIM_TimeBaseInitStructure.TIM_Period = 255;
14
   TIM_TimeBaseInitStructure.TIM_Prescaler = 0;
15
   TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV2; 
16
   TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
17
   TIM_TimeBaseInit( TIM1, &TIM_TimeBaseInitStructure);
18
19
   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
20
   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
21
   TIM_OCInitStructure.TIM_Pulse = 100; // Test wert!
22
   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
23
   TIM_OC4Init( TIM1, &TIM_OCInitStructure );
24
25
   TIM_CtrlPWMOutputs(TIM1, ENABLE );
26
   TIM_OC4PreloadConfig( TIM1, TIM_OCPreload_Disable );
27
   TIM_ARRPreloadConfig( TIM1, ENABLE );
28
29
   TIM_Cmd( TIM1, ENABLE ); // Enable TIM1


- (timer 2) Timer scheint nicht auf der gewünschten Frequenz zu laufen
Ich kann im Debugger leider nicht erkennen was hier schiefläuft.
1
   TIM_Cmd( TIM2, DISABLE ); //  TIM2 Aus
2
3
   // Enable TIM2
4
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE );
5
6
7
   TIM_TimeBaseInitStructure.TIM_Period = 0xFFFF; 
8
   TIM_TimeBaseInitStructure.TIM_Prescaler = 0;
9
   TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV2;
10
   TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
11
   TIM_TimeBaseInit( TIM2, &TIM_TimeBaseInitStructure);
12
13
  // 0xe79e = 20 Hz auf dem AVR
14
   TIM_SetCounter (TIM2, 0xe79e); 
15
   TIM_SetAutoreload (TIM2, 0xe79e);
16
17
18
   NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
19
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
20
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
21
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
22
   NVIC_Init(&NVIC_InitStructure);
23
24
   TIM2->INTFR = (uint16_t)~TIM_IT_Update;
25
   TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
26
   TIM_Cmd( TIM2, ENABLE ); // Enable TIM2
27
28
29
30
void TIM2_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
31
void TIM2_IRQHandler(void)
32
{
33
   TIM2->INTFR = (uint16_t)~TIM_IT_Update;
34
   // PWM auf neuen Stuetspunkt setzen
35
   TIM1->CH4CVR = 100;
36
}

von Peter S. (peter_sch)


Lesenswert?

Habe mir nur das TIM1-Beispiel angesehen und es sieht so aus, dass die 
AFIO-Konfiguration fehlt:

Im Register AFIO_PCFR1 müssen die Bits 7:6 auf 01 gesetzt werden, siehe 
CH32V003 Reference Manual V1.4 auf Seite 60.

von Dirk E. (dirk_1980)


Lesenswert?

Danke für das ansehen.

Muss aber zugeben das ich kurz vor deiner Antwort das selber gesehen 
hatte.
1
GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM1, ENABLE); // D3 anschalten
Hat gefehlt um die 2. Alternatve funktion einzuschalten.

Und noch für die Nachwelt:
1
TIM_TimeBaseInitStructure.TIM_ClockDivision  = TIM_CKD_DIV2;
Teilt nicht den Vorteiler, das macht
1
TIM_Prescaler = 1; // /2


So jetzt bleibt nur noch das mit dem Timer 2 und hier kome ich einfach 
nicht weiter. Der Timer macht einfach kein Reload wenn der oben ankommt. 
Der Interrup kommt aber und das allerdings dann auch nicht mit der 
Geschwindigkeit wie ich erwarten würde.
Im Debugger sehe ich im Counter Register Werte die nicht vorkommen 
sollten, weil sie unterhalb des Reload wertes liegen.

Vielleicht sieht ja jemand wo der Fehler ist.

von Stefan F. (Gast)


Lesenswert?

Benutzt du das Framework von ST auf einem Mikrocontroller von WCH?

von Harald K. (kirnbichler)


Lesenswert?

Das von WCH sieht nicht sehr anders aus ...

Hier ein Beispiel von WCH höchstselbst:

https://github.com/openwch/ch32v003/blob/main/EVT/EXAM/TIM/Synchro_Timer/User/main.c

von Dirk E. (dirk_1980)


Lesenswert?

Ja der Code sieht nach der SPL von ST aus.
Finde ich persönlich nicht mal schlecht.

Ich bin auf den Reload reingefallen.
Mal heist es .TIM_Period und dann TIM_SetAutoreload(...), landet aber im 
selben register.
Der Timer startet immer nach erreichen dieses Wertes von Null.
Und startet nicht bei diesem Wert immer wieder neu, was ich bei 
Autoreload erwarten würde.

Wert invers einsetzten (0xFFFF- Wert) und die Sache läuft.

Da wird es sicherlich noch andere Methoden geben, aber jetzt geht es 
erstmal.



Tja, neuer Prozessor neue Fehler / Probleme!

von Stefan F. (Gast)


Lesenswert?

Dirk E. schrieb:
> Ja der Code sieht nach der SPL von ST aus.
> Finde ich persönlich nicht mal schlecht.

Der Code von ST darf nur auf Mikrocontrollern von ST verwendet werden.

"4. This software package or any part thereof, including modifications 
and/or derivative works of this software package, must be used and 
execute solely and exclusively on or in combination with a 
microcontroller or a microprocessor devices manufactured by or for 
STMicroelectronics."

https://www.st.com/resource/en/license/SLA0048_STM32CubeF1.pdf.

von Dirk E. (dirk_1980)


Lesenswert?

Ich glaube wer einen ST Code auf einem WCH 1:1 kopiert und erwartet das 
der läuft, hat noch viel zu lernen.

Ihr schweift allerdings ab, wie kann man das hier schliesen?

von Charles Lee S. (charleslee_s)


Lesenswert?

Die einzige Sünde, die Sie begangen haben, ist, dass Sie nicht IHREN 
vollständigen Quellcode veröffentlicht haben.

von Harald K. (kirnbichler)


Lesenswert?

Und für diese wichtige Erkenntnis brauchtest Du zwei Monate, und 
musstest Dich hier eigens anmelden?

Das ist Einsatz. Respekt.

von Charles Lee S. (charleslee_s)


Lesenswert?

Ich habe diesen Thread ein oder zwei Stunden vor dem Posten gefunden. Da 
meine Muttersprache Englisch ist, halte ich eine Latenzzeit von zwei 
Monaten für angemessen. Nur weil ich zu spät poste, heißt das nicht, 
dass meine Argumentation irgendwie falsch ist.

Es ist weltweit üblich, den vollständigen Quellcode zu veröffentlichen, 
wenn Sie dabei Hilfe benötigen.

Möglicherweise sehe ich Fehler im veröffentlichten Quellcode, aber woher 
soll ich das wissen, wenn ich nicht den gesamten Code habe? Fehlende 
Teile könnten durchaus alles verändern.

von Harald K. (kirnbichler)


Lesenswert?

Do not use the formal "Sie" to address others when posting on 
german-language internet forums.
This is, though formally correct, in most cases considered rather rude 
and distanced.

Did you contribute anything useful? The thread's creator posted some 
excerpts of his source code, and had it not been sufficient for those 
who already answered, they would already have requested the full source 
code. They could discuss the subject at hand, apparently sufficient 
enough for the thread's creator not to ask further questions.

Had you contributed something to this thread, your "latency" would have 
been acceptable. But you didn't, and so it isn't.

You could have requested the full source code in a friendly manner, but 
no, you acted rather supercilious.

And for that you created a new user account?

: Bearbeitet durch User
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.