С алиэкспрес попался интересный экземпляр чипа SI5351, у которого по диапазону были пораженные точки (11МГц, 31.5МГц и много других частот), на которых генерация хаотично срывалась на 2-50мс с периодичность 10-200Гц. Думал проблема в коде управления, но оказалось в схеме тактирования. Так и не получилось по простому ей тактирование организовать от генератора МК, пришлось поставить отдельный кварц (ножки 2 и 3).
Ну и пользуясь случаем, обновил прошивку.
В ver1.4 : -------------------------------------------------------------
1. Исправлена ошибка на стартовом экране.
2. Коррекция кода управления si5351.
Добрый день. Залил прошивку v1.4, поставил кварц 25мГц на Si5351, пропал пункт меню высокочастотные выходы. Кварц не заводится? С прежней схемой тактирования работало.
И еще, программатор не видит МК (ST-LINK/V2). Через USB-бутлодер заливается нормально, в чем может быть причина.
С уважением Андрей.
[uquote="coba57",url="/forum/viewtopic.php?p=3743957#p3743957"]Кварц не заводится?[/uquote]
Скорее всего. Нужно подобрать конденсаторы от выводов кварца на землю. Вот апнота на эту тему : https://www.silabs.com/documents/public ... /AN551.pdf
[uquote="coba57",url="/forum/viewtopic.php?p=3743957#p3743957"]И еще, программатор не видит МК (ST-LINK/V2). Через USB-бутлодер заливается нормально, в чем может быть причина.[/uquote]
Как ни странно, это может быть связано с перепайкой кварца на SI5351. При программировании через ST-LINK задействуется нога PA14 мк, а это как раз линия SDA I2C шины, которая подходит к SI5351. Может посадили соплю на ее ногах ? Или сама SI5351 при остановленном тактовом генераторе блокирует I2C.
Еще может быть постоянно замкнут контакт энкодера S3 (линия SWDIO).
Ну или просто ошибка монтажа или КЗ/непропай цепей, используемых ST-LINK, или виновата настройка софта программатора.
Добрый вечер. Спасибо за помощь. Вышла из строя Si5351, заменил все работает. Почему вышла из строя не понятно.
Программатор не подключал, уже поздно. Еще раз спасибо. Андрей.
Повторил, всё заработало, памятку как пользоваться пока на телефоне , прошивал через USB и с кварцем на 8мгц.
Скажем так это прибор для человека который думает, а не для того кто гоняется за шумами, и РРМ, и особо ограничен с весом оборудования для ремонта.
А подсказка, проблему с шаговым приводом вычислить элементарно.
— Позвольте, а что вы будетее делать с трупами кошек?
— На польты пойдут!
Andrey_B, а поделитесь плиз исходником либо описанием быстрого цифрового синтеза? Или ткните носом где почитать.
Ну и хотелка (а вдруг сбудется?) - на отдельной страничке экрана строить АЧХ, можно даже в попугаях. Здорово поможет при настройке-постройке всяческих гитарных искажателей, а также исследованиях УЗ-излучателей. Раньше сам писал такую штуку на DSO-203, но какой-то редиске мой ослик сильно понадобился Большого ослика (DS1054) с собой не потаскаешь, а Ваш генератор - маленький но очень удачный приборчик. Спасибо.
[uquote="sslobodyan",url="/forum/viewtopic.php?p=3803470#p3803470"]Andrey_B, а поделитесь плиз исходником либо описанием быстрого цифрового синтеза?[/uquote]
Алгоритм общеизвестный DDS, в сети легко находятся множество описаний, http://www.rotr.info/electronics/mcu/st ... le_sin.htm. Конкретная реализация от Neekeetos в прицепе. Еще стоит ознакомится с исходниками ncp1400 вот тут https://www.radiokot.ru/forum/viewtopic ... 2&t=121330. Если интересует именно реализация различных вариантов модуляции, то вот кусок кода из ГА71: Спойлер
switch(B_Komb)
{
case 1: // Б = А + Б
while(Ii < Jj)
{
Mm = A_Table[phase_1>>22];
dac_buf[Ii++] = (((Mm+B_Table[phase_2>>22])>>1)<<16)|Mm;
phase_1 += freq_1;
phase_2 += freq_2;
}
break;
case 2: // Б = А * Б
while(Ii < Jj)
{
Mm = A_Table[phase_1>>22];
dac_buf[Ii++] = ((Mm*B_Table[phase_2>>22])&0xFFFF0000)|Mm;
phase_1 += freq_1;
phase_2 += freq_2;
}
break;
case 3: // Б = А * -Б
while(Ii < Jj)
{
Mm = A_Table[phase_1>>22];
dac_buf[Ii++] = (((((int32_t)B_Table[phase_2>>22]-(B_M_VolHalf<<1))*((~Mm)&0xFFFF))+((uint32_t)B_M_VolHalf<<17))&0xFFFF0000)|Mm;
phase_1 += freq_1;
phase_2 += freq_2;
}
break;
case 4: // Б = А ам Б
while(Ii < Jj)
{
Mm = A_Table[phase_1>>22];
dac_buf[Ii++] = (((((int32_t)B_Table[phase_2>>22]-B_M_VolHalf)*((~Mm)&0xFFFF))+((uint32_t)B_M_VolHalf<<16))&0xFFFF0000)|Mm;
phase_1 += freq_1;
phase_2 += freq_2;
}
break;
case 5: // Б = Б ам А
while(Ii < Jj)
{
Mm = A_Table[phase_1>>22];
dac_buf[Ii++] = (((((int32_t)Mm-A_M_VolHalf)*B_Table[phase_2>>22])+((uint32_t)A_M_VolHalf<<16))&0xFFFF0000)|Mm;
phase_1 += freq_1;
phase_2 += freq_2;
}
break;
case 6: // Б = А чм Б
while(Ii < Jj)
{
Mm = A_Table[phase_1>>22];
dac_buf[Ii++] = ((uint32_t)B_Table[phase_2>>22]<<16)|Mm;
phase_1 += freq_1;
phase_2 += (freq_2 +(uint32_t)(((uint64_t)(freq_2 -(freq_2>>3))*((~Mm)&0xFFFF))>>13))>>3; // (f+((7*f*(-Mm))/65536))/8
}
break;
default: // Б = Б, шум
while(Ii < Jj)
{
dac_buf[Ii++] = ((uint32_t)B_Table[phase_2>>22]<<16)|A_Table[phase_1>>22];
phase_1 += freq_1;
phase_2 += freq_2;
}
break;
}
[uquote="sslobodyan",url="/forum/viewtopic.php?p=3803470#p3803470"]Ну и хотелка (а вдруг сбудется?) - на отдельной страничке экрана строить АЧХ, можно даже в попугаях.[/uquote]
Так-то в планах есть что-то такое реализовать, но беда сейчас со временем.