Решил самостоятельно сделать свой частотник. Программу пишу самостоятельно. В моем случае я использую ATtiny 2313, синус формирую с отставанием на 60 градусов.
Для того чтоб формировать частоты до 400 Герц пришлось сильно оптимизировать код программы. Нумерация транзисторов 135 верх 462 низ, так более правильно. Теперь если полупериод 1 то 2 отстает на 60 градусов третий от второго на 60 градусов и.т.д
Как я построил синус и где была оптимизация кода.
Пример синуса
0 0 0 0 13 13
2 0 0 0 12 14
3 0 0 0 11 14
5 0 0 0 10 15
6 0 0 0 9 15
8 0 0 0 8 15
9 0 0 0 6 15
10 0 0 0 5 15
11 0 0 0 3 14
12 0 0 0 2 14
13 0 0 0 0 13
14 2 0 0 0 12
14 3 0 0 0 11
15 5 0 0 0 10
15 6 0 0 0 9
15 8 0 0 0 8
15 9 0 0 0 6
15 10 0 0 0 5
14 11 0 0 0 3
14 12 0 0 0 2
13 13 0 0 0 0
12 14 2 0 0 0
11 14 3 0 0 0
10 15 5 0 0 0
9 15 6 0 0 0
8 15 8 0 0 0
6 15 9 0 0 0
5 15 10 0 0 0
3 14 11 0 0 0
2 14 12 0 0 0
0 13 13 0 0 0
0 12 14 2 0 0
0 11 14 3 0 0
0 10 15 5 0 0
0 9 15 6 0 0
0 8 15 8 0 0
0 6 15 9 0 0
0 5 15 10 0 0
0 3 14 11 0 0
0 2 14 12 0 0
0 0 13 13 0 0
0 0 12 14 2 0
0 0 11 14 3 0
0 0 10 15 5 0
0 0 9 15 6 0
0 0 8 15 8 0
0 0 6 15 9 0
0 0 5 15 10 0
0 0 3 14 11 0
0 0 2 14 12 0
0 0 0 13 13 0
0 0 0 12 14 2
0 0 0 11 14 3
0 0 0 10 15 5
0 0 0 9 15 6
0 0 0 8 15 8
0 0 0 6 15 9
0 0 0 5 15 10
0 0 0 3 14 11
0 0 0 2 14 12
далее переводим все в нули и единицы
привожу только часть , сразу оговарюсь что 3 и 4 выход использую для тормоза и регулятора напряжения (значение порта инверсное! 1 столбик для 1 транзистора ,второй для второго и соответственно шестой для шестого , нумерацию транзисторов приводил выше)
0 0 0 0 1 1 63 8
0 0 0 0 1 1 63
0 0 0 0 1 1 63
0 0 0 0 1 1 63
0 0 0 0 1 1 63
0 0 0 0 1 1 63
0 0 0 0 1 1 63
0 0 0 0 1 1 63 5
0 0 0 0 1 1 63
0 0 0 0 1 1 63
0 0 0 0 1 1 63
0 0 0 0 1 1 63
0 0 0 0 1 1 63
0 0 0 0 0 0 255 2
0 0 0 0 0 0 255
1 0 0 0 1 1 62 2
1 0 0 0 1 1 62
0 0 0 0 1 1 63 8
0 0 0 0 1 1 63
0 0 0 0 1 1 63
0 0 0 0 1 1 63
0 0 0 0 1 1 63
0 0 0 0 1 1 63
0 0 0 0 1 1 63
0 0 0 0 1 1 63
0 0 0 0 1 1 63 2
0 0 0 0 1 1 63
0 0 0 0 0 1 127 2
0 0 0 0 0 1 127
0 0 0 0 0 0 255 1
1 0 0 0 1 1 62 3
1 0 0 0 1 1 62
1 0 0 0 1 1 62
0 0 0 0 1 1 63 8
0 0 0 0 1 1 63
0 0 0 0 1 1 63
0 0 0 0 1 1 63
0 0 0 0 1 1 63
0 0 0 0 1 1 63
0 0 0 0 1 1 63
0 0 0 0 1 1 63
0 0 0 0 0 1 127 3
0 0 0 0 0 1 127
0 0 0 0 0 1 127
0 0 0 0 0 0 255 1
Теперь где закономерность, самое главное. Если посмотреть на цифру с права то это значение порта в данный момент времени. Следующая цифра это количество раз какое нужно вывести эту цифру в порт. А теперь как осуществляется компрессия, вариантов цифр у меня получилось всего 19 вот они
0 31
1 62
2 63
3 124
4 126
5 127
6 155
7 159
8 191
9 217
10 219
11 223
12 248
13 249
14 251
15 252
16 253
17 254
18 255
а количество выводов сделал до 8 таким образом можно закодировать в одном байте 5 бит под номер числа и три бита под количество которое нужно его вывести включая 0, получается 8 значений, то есть 0 выводим 1 раз, 1 два, 7 восемь раз ну и ноль в значении порта соответствует 31 а 18 соответствует 255 получаем таблицу из чисел в сжатом формате для данной таблицы получилось всего 266 значений. Таким образом на обработку одного тика у меня получилось тратить 92 машинных цикла и соответственно с синусом 12 амплитуда и 12 длинна я с легкостью укладывался на 16 мегагерцах генерировать 400 герц. Надеюсь я понятно объяснил. Да еще вывод числа я вешаю на прерывание. Ну и соответственно чем реже я его вызываю тем меньше частота итогового сигнала.
P.S. Кодировка первого числа 00010111 = 23 или 02 значение порта 00010(переводим по таблице в 63) и вывести его 8 раз 111


