убился искать почему шим в разнос идет, а оказалось пример №3:
1184077.jpg
декларации (tmp* - диагностические переменные)
[spoiler=Спойлер]
Код: Выделить всё
...
int _gtv4 = 0; //PWM, рабочее значение ШИМ подаваемое в pin
...
int _gtv11 = 185; //PWM_upper_limit, Значение ШИМ выше которого ключ не реагирует на повышение
....
int _gtv9 = 6000; //Udestination, целевое напряжение для стабилизатора, mV
....
bool _gtv18 = 1; //is_fuse_on
...
bool _gtv21 = 0; //stUD
bool _gtv22 = 0; //stJUMP
bool _gtv23 = 0; //stTHICK
bool _gtv24 = 0; //stTHIN
int _gtv25 = 0; //tmp3
int _gtv26 = 0; //tmp4
int _gtv27 = 0; //tmp5
[/spoiler]
сам код Платы.
ПЕРВЫМ выполняется код Switch который управляется stJUMP, из середины откуда-ближе к концу.
в результате в pin пишется всякая чтопопала. снова нужно пилить плату на две.
[spoiler=Спойлер]
Код: Выделить всё
if(_gtv22) //stJUMP
{_swi3=(_gtv9)/(88);}
else
{_swi3=_swi5;} // ЗДЕСЬ ВТЫКАЕТСЯ НА ЗНАЧЕНИЕ swi5 ИЗ ПРЕДЫДУЩЕГО ЦИКЛА
if((_swi3) > (_gtv11))
{_swi4=_gtv11;}
else
{_swi4=_swi3;}
if(((_gtv4)+(_mux2)) <= (0)) // _swi5 РАСЧИТЫВАЕТСЯ ТОЛЬКО ЗДЕСЬ
{_swi5=0;}
else
{_swi5=(_gtv4)+(_mux2);}
_cd1 = 0; // КОД ПЛАТЫ ДОЛЖЕН НАЧИНАТЬСЯ ОТСЮДА !!!
if(( (_gtv24) && (_gtv21) )) {_cd1 = 1;}
if(( (_gtv24) && (!(_gtv21)) )) {_cd1 = 2;}
if(( (_gtv21) && (_gtv23) )) {_cd1 = 3;}
if(( (!(_gtv21)) && (_gtv23) )) {_cd1 = 4;}
if((_cd1) == 0) {_mux2 = 0;}
if((_cd1) == 1) {_mux2 = -1;}
if((_cd1) == 2) {_mux2 = 1;}
if((_cd1) == 3) {_mux2 = -5;}
if((_cd1) == 4) {_mux2 = 5;}
if(_gtv18)
{_swi6=_swi4;}
else
{_swi6=_gtv4;}
_gtv27 = _swi3;
_gtv25 = _mux2;
_gtv26 = (_gtv4)+(_mux2);
_gtv4 = _swi6;
[/spoiler]
в результате вместо сходимости ШИМ к 68 получаю адский разброс:
[spoiler=Спойлер]
Код: Выделить всё
PWM:
....
78
78
62
62
79
79
57
57
79
79
52
52
84
84
47
47
89
89
42
42
94
94
37
37
99
99
32
32
104
104
27
27
109
109
...
[/spoiler]
осциллограмма вообще фееричная

.
но по сумме это жесть!
Добавлено (25.02.2016, 19:18)
---------------------------------------------
что и требовалось доказать, разделение платы на две немедленно нормализовало работу.
а вот правильный код от двух плат
[spoiler=Спойлер]
Код: Выделить всё
_cd1 = 0;
if(( (_gtv24) && (_gtv21) )) {_cd1 = 1;}
if(( (_gtv24) && (!(_gtv21)) )) {_cd1 = 2;}
if(( (_gtv21) && (_gtv23) )) {_cd1 = 3;}
if(( (!(_gtv21)) && (_gtv23) )) {_cd1 = 4;}
if((_cd1) == 0) {_mux2 = 0;}
if((_cd1) == 1) {_mux2 = -1;}
if((_cd1) == 2) {_mux2 = 1;}
if((_cd1) == 3) {_mux2 = -5;}
if((_cd1) == 4) {_mux2 = 5;}
_gtv25 = (_gtv4)+(_mux2);
if(_gtv22)
{_swi3=(_gtv9)/(88);}
else
{_swi3=_swi5;}
if((_swi3) > (_gtv11))
{_swi4=_gtv11;}
else
{_swi4=_swi3;}
if((_gtv25) <= (0))
{_swi5=0;}
else
{_swi5=_gtv25;}
if(_gtv18)
{_swi6=_swi4;}
else
{_swi6=_gtv4;}
_gtv4 = _swi6;
[/spoiler]
У вас нет необходимых прав для просмотра вложений в этом сообщении.