Я предполагаю, что вы используете 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
В зависимости от спецификаций сервопривода вам, возможно, придется немного изменить их, чтобы предотвратить смещение цикла, но сервоприводы обычно довольно просты.
Вам нужно найти примеры синтаксиса обработчика прерываний для вашего компилятора и всегда читать руководство о том, как использовать регистры для управления таймерами и разрешения прерываний.
Удачи и опубликовать новыйвопрос с некоторым кодом, когда у вас есть больше завершено.