Hallo zusammen, ich habe ein Problem und zwar die Duty Cycle zu berechnen. Die Variable duty bleibt immer null. Aber wenn ich die Variable duty so duty=Puls_new/9; berechne, dann hat die Variable duty einen Wert. while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ puls2=Puls_new+Puls_freq; duty=Puls_new/puls2; } /* USER CODE END 3 */ void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { /* Prevent unused argument(s) compilation warning */ UNUSED(htim); if(htim==&htim5){ Puls_new=HAL_TIM_ReadCapturedValue(&htim5,TIM_CHANNEL_4); //Falling Puls_freq=HAL_TIM_ReadCapturedValue(&htim5,TIM_CHANNEL_1); // Rising __HAL_TIM_SetCounter(&htim5,0); } } Puls_new >> Ton Puls_freq>> Toff kann Jemand bitte helfen ?
Mark schrieb: > duty=Puls_new/puls2 Mach da doch Mal auf die rechte Seite einen Cast nach float hin:
1 | duty=(float)Puls_new/puls2 |
Eventeull folgendes: ushort/ ushort = ushort, dann erst zu float convertiert? probier mal: duty=((float)Puls_new)/puls2; das sollte reichen, theoretisch muss nur einer von beiden float sein damit float rauskommt. duty=(float)Puls_new/puls2; sollte auch ohne Klammern gehen, da typecast vor division. ansonsten sieht das nach stm32 aus, da sind float nicht so präzise, aber 0 sollte es nicht werden.
Mark schrieb: > puls2=Puls_new+Puls_freq; > duty=Puls_new/puls2; Überlege dir einfach, was bei deiner Rechnung rauskommt, wenn du die Division als Ganzzahlrechnung ausführst. Solange Puls_new kleiner als puls2 ist, kommt da immer 0 raus. Die Floatrechnung ist dort völlig überflüssig und gegenüber einer gleichgroßen unsigned Int ungenauer, weil Bits für den Exponenten verschwendet werden. Die Dynamik eines Float brauchst du gar nicht. Rechne mit Fixkommazahlen, also z.B. für 8 Bit Duty Cycle
1 | uint16_t duty; |
2 | duty=Puls_new*256/puls2; |
Wolfgang schrieb: > uint16_t duty; > duty=Puls_new*256/puls2; Sorry, sehe gerade, dass Puls_new und puls2 bei dir wohl uint16_t sind. Dann muss es für 8 Bit DC natürlich heißen
1 | uint32_t duty; |
2 | duty = (uint32_t) Puls_new*256 / puls2; |
bzw. für 16 Bit DC
1 | uint32_t duty; |
2 | duty = (uint32_t) Puls_new*65536 / puls2; |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.