Есть в связи с этим такая мысль: А не оставить-ли в покое родную систему зажигания
Именно так я и хотел сделать с самого начала. Тем более, что родной коммутатор моей Хонды Дио уже имел хороший встроенный УОЗ. Но вся проблема заключалась в невозможности его достать. Все коммутаторы, которые у нас продаются только для стандартного CDI-зажигания с высоковольтной обмоткой генератора, которой нет в этом скутере. Кроме того эти коммутаторы не имеют УОЗ, а без него двигатель не развивает тяги, так как штатный положительный импульс датчика с нулевым опережением (ровно в ВМТ). Из-за этого я и затеял весь этот проект с процессорным регулированием угла опережения. Хотя сейчас ни чуть об этом не жалею. Приобрел новый опыт и, наконец, запустил в эксплуатацию этот скутер. Осталось только доделать CDI-зажигания со встроенным преобразователем (аналог его родного). Хотя если идея получится, его можно будет без какой либо переделки применять для CDI с высоковольтной обмоткой генератора. Просто в этом случае не будет устанавливаться преобразователь и использоваться вывод контроллера, отвечающий за него. Прошивка остается та же. Хотя при желании ее конечно можно будет оптимизировать под такой вариант исполнения.
А сейчас, алгоритм, на котором я окончательно остановился, имеет следующий вид. В начале работы (сразу после завода) иска подается прерыванием положительного импульса датчика, так как нет еще данных о времени предыдущего рабочего цикла. Оно же исполняет страховочную роль во всех режимах работы на случай опоздания подачи искры прерыванием таймера.
В качестве основного импульса используем отрицательный импульс датчика. Он запускает прерывание по совпадению таймера, который подсчитывает время вращения коленвала за рабочий цикл (время от предыдущего отрицательного импульса до следующего). Этим уже исключается вероятность подачи искры раньше прихода отрицательного импульса, что было возможно в предыдущих моих разработках. Также на много повысилась точность формирования угла опережения. Если программа после прихода отрицательного импульса успеет его прощать раньше появления совпадения таймера, то уже в этом цикле будет использовано его новое откорректированное значение, если нет то для подачи искры будет взято предыдущее значение. Во всяком случае отсчет таймера до момента появления искры ведется от прихода отрицательного импульса датчика текущего цикла, а не от положительного предыдущего цикла. И, соответственно, время отсчета сокращено в 8 раз (для моего скутера). За счет этого и погрешность определения угла тоже существенно уменьшается.
В рабочем режиме одно и тоже прерывания по совпадению таймера запускается четыре раза:
1) Выключается преобразователь. Открывается тиристор. Запрет прерываний от датчика. Пауза 30 мкс.
2) Снимается управляющее напряжения с тиристора. Пауза 1 мс.
3) Включается преобразователь. Пауза 800 мкс.
4) Разрешение прерываний от датчика.
Прерывание каждого импульса датчика само себя запрещает. И последующая их обработка возможна только с разрешения прерываний совпадения или переполнения главного таймера. Этим обеспечивается защита от ложных срабатываний и наводок от катушки зажигания, которые при надлежащем экранировании уже не должны влиять на точность работы схемы.