Hi,
ich möchte eine Datenprotokoll senden, welches pro Bit den Aufbau 20us
low, 20us 0=high/1=low, 20us high hat. Das dann halt 8mal für ein Byte
Ich wollte dafür einen Timer mit 60us Periode benutzen und dann
entsprechend den DutyCycle mit 33 oder 66% einstellen. Aufgrund der
knappen Timings per DMA-PWM. Ich benutze CubeMX & ST HAL
Testweise gebe ich ein Byte 0x00 aus.
Prinzipiell klappt das auch, aber ich habe zwei Probleme:
Der erste Puls ist kürzer. Statt 40us nur 36us. Die anderen Pulse
entsprechen den 20us low & 40us high wie ich sie erwarten würde.
Ich bekomme am Ende noch einen Spike welcher dort nicht hingehört.
Hat jemand eine Idee was da mögliche Ursachen sein können? Ich bin da
gerade etwas ratlos wo das Verhalten herkommen könnte.
Bei den Spike könnte ich mir vorstellen, dass ich die PWM nicht schnell
genug abstelle(evtl sind die HAL Funktionen zu lang?) oder ich habe noch
etwas mit der Polarität verpeilt
Aber warum der erste Pulse eine andere Länge hat verstehe ich überhaupt
nicht.
Hier mal mein runtergestrippter send-code (das ich sonst sicherstellen
müßte das meine Daten fertig gesendet sind ist mir klar. Aber das delay
ist hinreichend lang so dass das nicht die Ursache sein sollte
1 | extern TIM_HandleTypeDef htim1;
|
2 | extern DMA_HandleTypeDef hdma_tim1_ch1;
|
3 | uint16_t out_buffer[12*8];
|
4 |
|
5 | void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef* htim)
|
6 | {
|
7 | if (htim->Instance == htim1.Instance){
|
8 | HAL_TIM_PWM_Stop_DMA(htim, TIM_CHANNEL_1);
|
9 | }
|
10 | }
|
11 |
|
12 | void send(uint32_t inp)
|
13 | {
|
14 | HAL_StatusTypeDef status;
|
15 | for (int i = 7; i >= 0; i--) {
|
16 | if (inp & (1 << i)) {
|
17 | out_buffer[i] = 6719;
|
18 | } else {
|
19 | out_buffer[i] = 3356;
|
20 | }
|
21 | }
|
22 |
|
23 | status = HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_1, (uint32_t*)&out_buffer, 8);
|
24 | }
|
25 |
|
26 | void sendTask()
|
27 | {
|
28 |
|
29 | while (1) {
|
30 | send(0x00);
|
31 |
|
32 | osDelay(1000);
|
33 | }
|
34 | }
|
Die CPU läuft mit 168MHz und der Timer ohne Prescaler auch mit 168MHz.
Hat jemand eine Idee was ich da prinzipiell falsch mache? Ich habe mal
die TimerKonfiguration angehängt.
Danke für evtl. Anregungen