Как сгенерировать ШИМ для управления серводвигателем на STM32F103 с таймером - PullRequest
0 голосов
/ 06 сентября 2011

Как сгенерировать ШИМ для управления серводвигателем на STM32F103 с таймером Код C я хочу управлять серводвигателем от ШИМ Я получаю значение от АЦП, а затем рассчитываю до коэффициента заполнения ШИМ

Блок-схема получить значение VR -> модуль АЦП (преобразовать аналоговый в цифровой) -> рассчитать рабочий цикл ШИМ -> использовать таймер для генерации ШИМ для управляющего серводвигателя -> во время цикла

извините за мой английский язык.

Ответы [ 2 ]

1 голос
/ 13 марта 2012

В этом коде предполагается, что частота APB1 = 72 МГц Servo_Target равна восьмой микросекунде, поэтому 4000 означает 1 мс (низкое положение сервопривода), а 8000 означает 2 мс (высокое положение сервопривода) ПРЕДУПРЕЖДЕНИЕ: частота ШИМ составляет 463 Гц, поэтому ВЫ НЕ МОЖЕТЕ ИСПОЛЬЗОВАТЬ ЭТУ НАСТРОЙКУ ДЛЯ АНАЛОГОВОГО СЕРВО.Это работает для бесщеточных регуляторов.ЕСЛИ ВЫ ХОТИТЕ ИСПОЛЬЗОВАТЬ ДЛЯ АНАЛОГОВОГО СЕРВО, ВЫ ДОЛЖНЫ ИЗМЕНИТЬ TIM_Prescaler, TIM_Period и учесть влияние на значения Servo_Target

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode   = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period        = 8192;                       
TIM_TimeBaseStructure.TIM_Prescaler     = 18;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_Cmd(TIM2, ENABLE);  // Start PWM Timer
TIM_OCInitStructure.TIM_OCMode      = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity  = TIM_OCPolarity_High;

// THIS IS THE WIDTH in 1/8 us
TIM_OCInitStructure.TIM_Pulse       = Servo_Target;     

/* PWM1 Mode configuration: TIM2 Channel1 */
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);

/* PWM1 Mode configuration: TIM2 Channel2 */
TIM_OC2Init(TIM2, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);

// add OC3_ and OC4_ for 3rd and 4th channels    
TIM_ARRPreloadConfig(TIM2, ENABLE);
0 голосов
/ 07 сентября 2011

Я предполагаю, что вы используете IDE и пишете на C, но я не знаком с этим устройством.

В основном вам нужно использовать таймеры, которых на устройстве несколько, и прерывание записиобработчики прерываний «сравнения результатов».Если включено прерывание сравнения выходных данных, то каждый раз, когда значение в таймере совпадает со значением в определенном регистре, ваш обработчик вызывается.

Обычная техника - заставить обработчик переключать вывод на сервопривод,затем измените значение в регистре сравнения выходных данных, чтобы обработчик снова сработал, когда он вам понадобится в следующий раз.

if(off)
   turn pin on
   ocreg += pwm_value
else
   turn pin off
   ocreg += cycle-pwm_value

Контакт будет оставаться включенным в течение нужного промежутка времени и всегда включаться в то же времячастота.Вам нужно найти хорошие значения для этих переменных на основе спецификаций сервопривода.

Вы можете использовать другой таймер для выборки АЦП по регулярному расписанию или встроить его в тот же обработчик прерываний, что и в ШИМ, или дажепросто дайте ему поработать в занятом цикле, ожидая окончания АЦП.

main()
  loop
    start ADC
    while (ADC busy) { do nothing }
    calculate pwm and store in variable pwm_value
    loop

В зависимости от спецификаций сервопривода вам, возможно, придется немного изменить их, чтобы предотвратить смещение цикла, но сервоприводы обычно довольно просты.

Вам нужно найти примеры синтаксиса обработчика прерываний для вашего компилятора и всегда читать руководство о том, как использовать регистры для управления таймерами и разрешения прерываний.

Удачи и опубликовать новыйвопрос с некоторым кодом, когда у вас есть больше завершено.

...