2023-11-18 04:28 PM
Hi, I'm a relatively new programmer, attempting to program a "Bluepill" module, which has the STM32F103C8T6 microcontroller. I'd like to be able to quickly change the duty cycle on a PWM output, so that I can adjust the position of a servo motor as I change the position of an attached joystick. The trouble is that every time I change the value of the CCR register for the desired timer and channel, there is an enormous delay (usually about 5 seconds or so) until the PWM duty cycle actually changes to reflect the new value, and subsequently, when the servo changes position.
I used this tutorial as a starting point before modifying it a bit to include a handle for the servo motor that I attach. I've attached my main.c file as well as the source and header files I made for the servo itself. You can find the call to SERVO_MoveTo on line 270 of main.c.
Should I be using DMA to transfer the data over to the CCR register quicker? I'm not sure if that would be appropriate or not.
Thank you in advance.
2023-11-18 07:21 PM
I won't go through all your code, but there is no hardware feature that significantly delays CCRx register updates even without DMA. Check all your calculations and/or add debug output.
I would set the prescaler such that the timer increments per microsecond like
PSC = (HAL_RCC_GetPCLK1Freq()/1000000)-1 Note the -1.
Then, for a 50ms period
ARR=50000-1
which makes it easy to set CCR to a value in the range you want.
Since you are using the HAL functions, update CCR with
__HAL_TIM_SetCompare(&htimX, TIM_CHANNEL_Y, Z-1);
(your struct member for CCR is missing a volatile which may be crucial)
hth
KnarfB