Closed AnatolSher closed 1 year ago
Thank you. A little note on the code Since the duty formula is like this:
Duty Cycle = (19 + 1) / (99 + 1) = 20%
is the value of DUTY_MAX should be 99, not 100?
Is anywhere a documentation for the HAL ver "0.4.0" ?
Я не знаю какое значение должен иметь DUTY_MAX. Примеры по тестированию периферии я не придумываю сам. Это адаптация кода из папки DEMO стандартного SDK. Но насколько я понял, при беглом прочтении, из даташита (reference manual) на 80х серию, PWM там 8 битный. Т.е коэффициент заполнения может принимать значения от 0 до 0xFF. Эта формула имеет отношение к инициализации PWM модуля. Там даже есть немного пояснений в виде PWM Frequency = 40MHz / Prescaler / (Period + 1); Duty Cycle(Edge Aligned) = (Pulse + 1) / (Period + 1) Duty Cycle(Center Aligned) = (2 Pulse + 1) / (2 (Period + 1)) Но я глубоко не вникал в эти подробности. Единственно, на что обратил внимание, что HAL "0.6.0" имеет более качественный и понятный код нежели "0,4,0". Никакой документации на HAL , как например STM делает, я не нашел. Препарирую внутренности при помощи CDK и CKLink-Lite.
I don't know what value DUTY_MAX has. I do not invent examples for testing peripherals myself. This is an adaptation of the standard code from the DEMO SDK folder. But how did I understand, with a cursory reading, from the datasheet (reference manual) for the 80s series, PWM is 8 bit there. That is, the accounting factor can take values from 0 to 0xFF. This formula is related to the excitation of the PWM module. There are even some explanations in the form PWM Frequency = 40MHz / Prescaler / (Period + 1); Duty Cycle(Edge Aligned) = (Pulse + 1) / (Period + 1) Duty Cycle(Center Aligned) = (2 Pulse + 1) / (2 (Period + 1)) But I didn't go deep into those details. The only thing I noticed is that HAL "0.6.0" has a better and more understandable code than "0.4.0". I did not find any documentation on HAL, such as STM does. Dissecting the insides with CDK and CKLink-Lite.
Could you please show the link to SDK ?
Сейчас проверил осциллографом выход PWM канала в "независимом" режиме. От 0 до FF картинка заполнения на экране четкая. PWM 8 битный.
Now I checked the output of the PWM channel in "independed" mode with an oscilloscope. From 0 to FF, the filling pattern on the screen is clear. PWM is 8 bit.
Сейчас проверил осциллографом выход PWM канала. От 0 до FF картинка заполнения на экране четкая. PWM 8 битный.
Это верно, но не имеет отношения к вашему примеру hal_pwm_led В примере вы устанавливаете сброс таймера по совпадению на значении 99, а значит и максимальное значение регистра сравнения (duty) уже не может быть более 99. Мое замечание было только об этом, я не собирался подвергать сомнению пример в целом.
Я, кстати. запустил его на реальной плате и посмотрел сигналы логическим анализатором... это то как я увидал эту ошибку.
Thank very much for the links :)
Возможно я еще что то не догоняю... Но установка коэффициента заполнения приводи в конечном итоге к вызову функции
__PWM_Duty_Config с прямой установкой значения в регистр CMPDAT. Поэтому, мне кажется, не важно что там китайцы записали в hpwm->Init.Pulse в процессе инициализации.
не важно что там китайцы записали в hpwm->Init.Pulse в процессе инициализации.
Тем не менее, Вы можете посмотреть сами - установка заполнения 99 в вашем примере дает постоянный высокий сигнал на выходе, то есть duty = 100%
Вот эта формула довольно однозначна:
Duty Cycle(Edge Aligned) = (Pulse + 1) / (Period + 1)
Чтобы получить на выходе Duty Cycle = 100, надо подставить в нее 99.
Ок. Возможно... Что то мне подсказывает что надо еще и периодом манипулировать чтобы получить нужную дискретность заполнения в диапазоне от 0 до FF. Требует глубокого осмысления китайских иероглифов :) Придется расчехлить мой DSLogic. На ослике мог не заметить нюансов
Закрываю.
For HAL ver "0.4.0" Tested. Add to example folder pls hal_pwm_led.ZIP