Цитата
в котором сквозняк исключен аппаратно
Да не в этом дело. Само рассуждение о "сбойнувших времянках" - суть слабое владение вопросом теории и практики применения микроконтроллеров. В качестве апофеоза можно вспомнить Дохтура, который рассуждал о том, какие команды процессора больше сбоям подвержены

С другой стороны нужно четко понимать, что и как ты делаешь. Как правильно любит говорить
Microwatt, 99% эмбеддеров (которых правильно называть "эмбеддерами" (в кавычках), вкладывая в слово ругательный смысл) понятия не имеют ни об аналоговой схемотехнике, ни о способах построения преобразователей напряжения, ни в алгоритмах управления, да и владение вопросом программирования конкретно используемого камня оставляет желать много лучшего.
Аналогично, о полном неприятии решений вопросов построения источников питания с использованием микроконтроллеров именно для управления ключами и замыкания ОС заявляют апологеты аналоговой схемотехники (например, в лице господина
Microwatt'а), ибо обнаруживают полное незнание микроконтроллерной тематики.
Соответственно, топикстартеру надо отдавать себе отчет в следующих моментах:
1. Смысл применения микроконтроллера. Будет хитрый алгоритм? Или прельщает цена вопроса в 80 центов, а партия железа планируется будь-здоров?
2. В выбранном микроконтроллере аварийное отключение выходов можно будет обеспечить примерно за 6-10 тактов, что эквивалентно 0.4-0.6мкс при тактовой частоте 16МГц.
3. Код управления (например, PID-регулятор) будет довольно специфичным, ибо необходимо обеспечить максимальное быстродействие. Соответственно, надо иметь необходимый экспиренс в программировании на ассемблере. Если вот такой пример не вызывает отторжения, то можно браться:
CODE
#include <ioavr.h>
#define PROTEUS
#define DEBUG_SPEED
#define K_INT 3
COMMON INTVEC:CODE:ROOT(1)
ORG ADC_vect
;Прерывание по COMPA
RJMP do_pi
#define VL R8
#define VH R9
#define UREFL R10
#define UREFH R11
#define INTL R12
#define INTH R13
#define SREG_SAVE R14
#define ZERO R15
;
RSEG CODE:CODE:NOROOT(1)
;
do_pi:
#ifdef DEBUG_SPEED
SBI PORTB,2
#endif
IN SREG_SAVE,SREG
IN VL,ADCL
IN VH,ADCH
SUB VL,UREFL ;V=ADC-REF, т.е. знак обратный (у нас инверсный ШИМ)
SBC VH,UREFH
; COM VL
; COM VH ;
BRMI v_minus ;Отрицательное V рассматриваем отдельно из-за другой проверки переполнения интегратора
;Ошибка >0
REPT K_INT
ADD INTL,VL
ADC INTH,VH
BRCS int_ovf_max ;Переполнение интегратора, перенос при INT>0xFFFF
ENDR
ADD VL,INTH ;
ADC VH,ZERO
BRNE res_ovf ;Переполнение результата
;Все нормально, ничего не вылезло, VL
OUT OCR1A,VL
OUT SREG,SREG_SAVE
#ifdef DEBUG_SPEED
CBI PORTB,2
#endif
RETI
;Ошибка <0 (напряжение на выходе меньше требуемого)
v_minus:
REPT K_INT
ADD INTL,VL
ADC INTH,VH
BRCC int_ovf_min ;Обратное переполнение интегратора, нет переноса при INT<0
ENDR
ADD VL,INTH ;
ADC VH,ZERO
BRNE res_ovf ;Переполнение результата
;Все нормально, ничего не вылезло, VL
OUT OCR1A,VL
OUT SREG,SREG_SAVE
#ifdef DEBUG_SPEED
CBI PORTB,2
#endif
RETI
;Интегратор > 0xFFFF
int_ovf_max:
CLR INTH
DEC INTH
MOV INTL,INTH
OUT OCR1A,INTH
OUT SREG,SREG_SAVE
#ifdef DEBUG_SPEED
CBI PORTB,2
#endif
RETI
;Интегратор <0
int_ovf_min:
CLR INTL
CLR INTH
#ifdef PROTEUS
INC INTL
#endif
OUT OCR1A,INTL
OUT SREG,SREG_SAVE
CBI PORTB,2
RETI
;Переполнение результата I+P, проверяем знак
res_ovf:
BRMI res_ovf_minus
;Результат >255
CLR VL
DEC VL
OUT OCR1A,VL
OUT SREG,SREG_SAVE
#ifdef DEBUG_SPEED
CBI PORTB,2
#endif
RETI
;Результат <0
res_ovf_minus:
CLR VL
#ifdef PROTEUS
INC VL
#endif
OUT OCR1A,VL
OUT SREG,SREG_SAVE
#ifdef DEBUG_SPEED
CBI PORTB,2
#endif
RETI
END
4. В приведенном выше примере отсутствует D-звено. Оно реализовано конденсатором снаружи параллельно верхнему резистору делителя (опорное используется 1.1В). Это узкий момент - дело в том, что АЦП прилично шумит в младших разрядах, посему программное D-звено только усугубляет проблему (его же не отфильтруешь, оно перестанет быть D-звеном

). А аппаратное (в виде конденсатора) убивает 2х зайцев - решает проблему шума АЦП и уменьшает эквивалентное сопротивление источника сигнала на ВЧ, там, где основные проблемы.
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин