Автор |
Сообщение |
|
Дата: 27 Янв 2008 20:20:44
#
Огромный, тёплый привет Всем!
Я очень загорелся идеей построить SDR приёмник на безе ТВ тюнера.
Подогнал мне ТВ тюнер lifeView FlyVideo'98 FM, тюнер какой то LG без опознавательных знаков, вскрытие показало, имеем: tda5737w hyperband and UHF mixers/oscillators for TV and VCR 3-band tuners, sa5523 1.4 GHz I2C-bus controlled multimedia synthesizer, tda9809 Single standard multimedia IF-PLL and FM radio demodulator, tda7040 Low voltage PLL stereo decoder. Поиск в Интернете, разпиновка, привёли, что это аналог Philips fm1216 http://pvr.sourceforge.net/FM1216.pdf .
Взял его за основу т.к. в нём всё есть: встроенный преобразователь 32в, FM демодулятор, в общем, всё для построения простого сканирующего приёмника и для SDR можно вытащить ПЧ.
Cдул я его с PCI карты, собрал на макетке, развёл питание, купил lcd Winstar WH1202A-YGH-CT, взял исходники на Си для Lcd - пример из PICC, переделал их под один порт (PortB PIC), нашёл исходник на Си реализации I2C тут http://robo.com.ua/readarticle.php?article_id=22 , скачать симулятор Proteus, нарисовал в нём схему, написал программу на Си для PIC, отладил общение с Lcd, отладил протокол I2C, распаял на макетке, сегодня воплотил в железе, нашёл ошибки, отладился и птичка заиграла ). Пока для теста я настроил мой тюнер на одну FM станцию, т.е. я рассчитал управляющие байты для 102.2 МГц, передал их по I2C тюнеру, получил от него ACK. Вывел ACK на LCD и снял звук с тюнера )
Впереди написание программы сканирования, ручного ввода частоты, драйвера клавиатуры, разобраться с отображением кириллицы. Далее планирую сделать SDR модуль, подключить по I2C календарь, память (для хранения результатов сканирования), USART (Com) для связи с компьютером.
Самое приятное, что внешних компонентов минимум. И этот минимум в настройке не нуждается
Продолжение следует. |
|
Дата: 28 Янв 2008 01:54:42
#
А опубликовать железную часть (схему), слабо ;-) ? А то пробегало на форуме уже не раз: "я сделал, у меня работает" и все...
|
Реклама Google
|
|
|
Дата: 28 Янв 2008 21:02:47
#
Nemo присоединяюсь
|
|
Дата: 29 Янв 2008 09:39:19 · Поправил: Диня (29 Янв 2008 12:37:27)
#
Схему вышлю, но без SDR тракта, усилителя, т.к. их пока нет. Сейча очень занят на работе и дома.
|
|
Дата: 30 Янв 2008 00:15:52
#
http://www.radioscanner.ru/files/download/file5059/shema1.jpg
Это экспорт схемы из Proteus, которую использовал для отладки I2C и LCD.
Сам тюнер fm1216 на ней не показан, т.к. уверен, что в библиотеке proteus его имхо нет. Надо рисовать самому. Но подключить fm1216 просто 12, 24 через LC-фильтры на +5в, 15 на землю, 13,14 SCL,SDA (I2C), корпус земля.
PCA9536 использовался для отладки I2C схемы - он не нужен в реальной схеме.
Усилитель звука не указан т.к. временно использую, то что было под рукой - усилитель от автомагнитолы.
Клавиатура - "набросок". |
|
Дата: 30 Янв 2008 00:55:26
#
В принципе все понятно. Будем попробовать :)
|
|
Дата: 30 Янв 2008 10:34:53
#
Все конечно здорово...но самое то главное, откуда ПЧ вытаскивать.... Мы все же SDR обсуждаем.
|
|
Дата: 30 Янв 2008 15:07:06
#
|
|
Дата: 30 Янв 2008 22:59:01
#
Посмотрел, сигнал очень слабый, через делитель 1:10 не виден, без делителя увидел где то около 5мВ, развёртка не синхронизировалась.
|
|
Дата: 31 Янв 2008 14:19:02
#
А ты на вход тюнера чего нибудь подавал? Хотя все равно 22 нога не катит... Туда выходит ПЧ звука и скорее всего довольно узкая, а для SDR надо хотя бы килогерц 100.
|
|
Дата: 31 Янв 2008 17:27:56 · Поправил: Диня (31 Янв 2008 17:28:58)
#
А ты на вход тюнера чего нибудь подавал? Хотя все равно 22 нога не катит... Туда выходит ПЧ звука и скорее всего довольно узкая, а для SDR надо хотя бы килогерц 100.
На входе была антенна, играло 102.2 Мгц.
Не согласен, имхо там широкий сигнал т.к. он идёт на 22 до фильтра 10.7, а после фильтра он идёт на FM детектор, смотрите ещё datasheet tda9809.
|
|
Дата: 04 Фев 2008 01:03:16 · Поправил: Диня (04 Фев 2008 01:04:17)
#
Пока сделал:
1. две кнопки - переключение "каналов" вверх, вниз, пока только с шагом 50кГц;
2. переключение диапазонов от значения делителя;
3. расчёт частоты приёма от значения "делителя";
4. преобразование числа (частоты) в текст, вывел на экран, сейчас мучаюсь с символом "," что б вставить после целого значения (частоты) МГц, чтоб было так: "102,2МГц", а не как сейчас: "10220" - разбираюсь с указателями в Си...
|
|
Дата: 04 Фев 2008 03:45:24 · Поправил: GenaSPB (04 Фев 2008 04:00:56)
#
4. преобразование числа (частоты) в текст, вывел на экран, сейчас мучаюсь с символом "," что б вставить после целого значения (частоты) МГц, чтоб было так: "102,2МГц", а не как сейчас: "10220" - разбираюсь с указателями в Си...
Какие, нафик, указатели! Хотя, на самом деле, надо сказать - Какой sprintf! Память еще не кончилась, так и скажите...
Обращаю внимание - функция ldiv (как и div) - это стандартная библиотечнай функция, требует включения хеадера stdlib.h. Отображением частоты занимается функция ws1602_dispfreq - wrapper для lcd_menu_value.
будут вопросы (включая необходимость в полных исходниках - которые очень слегка используют специфические особенности atmel-овских процессоров (естественно, инициализация и прерывания) - пишите, выложу.
void lcd_menu_value(
unsigned long freq,
unsigned char width, // full width
unsigned char comma, // comma position (from right, inside width)
unsigned char rj // right truncated
)
{
static const unsigned long vals [] =
{
10000000,
1000000,
100000,
10000,
1000,
100,
10,
1,
};
unsigned char j = (sizeof vals /sizeof vals [0]) - rj;
unsigned char i = (j - width);
unsigned char z = 1; // only zeroes
ws1602_wrcmd(0x80 | 0x00); // курсор в начало первой строки
for (; i < j; ++ i)
{
ldiv_t res = ldiv(freq, vals [i]);
if (comma == (j - i))
ws1602_wrdata('.');
if (z == 1 && (i + 1) < j && res.quot == 0)
ws1602_wrdata(' '); // supress zero
else
{
z = 0;
ws1602_wrdata('0' + res.quot);
}
freq = res.rem;
}
}
void lcd_menu_name(
unsigned char paramno, /* zero-based parameter index */
const char * paramname /* parameter name string */
)
{
ws1602_wrcmd(0x80 | 0x40); // курсор в начало второй строки
ws1602_wrdata('F');
ws1602_wrdata('0' + paramno / 10);
ws1602_wrdata('0' + paramno % 10);
ws1602_wrdata(' ');
ws1602_string(paramname);
}
void ws1602_dispfreq(unsigned long freq)
{
lcd_menu_value(freq, 7, 2, 1);
}
void ws1602_dispmode(unsigned char mode, unsigned char special, unsigned char att, unsigned char lock, unsigned char agcmode)
{
ws1602_wrcmd(0x80 | 0x00 | 8); // курсор в 8 pos первой строки
ws1602_string(lock ? "*" : " ");
ws1602_wrcmd(0x80 | 0x00 | 12); // курсор в 12 pos 1-st string
ws1602_string(mode2string [mode]);
ws1602_wrcmd(0x80 | 0x40 | 0); // курсор в 0 pos второй строки
ws1602_string(att ? "-10dB" : " ");
ws1602_wrcmd(0x80 | 0x40 | 8); // курсор в 8 pos второй строки
ws1602_string(special ? "x20 " : " ");
ws1602_wrcmd(0x80 | 0x40 | 12); // курсор в 12 pos 1-st string
ws1602_string(agcmode2string [agcmode]);
}
|
|
Дата: 04 Фев 2008 12:44:02 · Поправил: Диня (04 Фев 2008 14:20:38)
#
Какой sprintf? Я использую самописная функцию (не мою), я взял за основу и корректировал - прекрасно справляется с задачей преобразования в текст, а про прожорливость sprintf я читал, поэтому и не использую, буду дома приведу пример "своего" преобразования.
|
|
Дата: 04 Фев 2008 20:12:12
#
Вот расчтёт частоты от делителя и вывод частоты на LCD
unsigned int temp;
char str_buf[7];
// Перевод числа в строку
char *int2str(char *buf, unsigned long num)
{
char str[7];
char *ptr = &str[6];
int tmp;
*ptr = 0;
do {
tmp = num / 10;
*--ptr = '0' + (num - tmp * 10);
num = tmp;
} while (num != 0);
while ((*buf++ = *ptr++) != 0);
return buf - 1;
}
// Вызов
freq=chanel*5-1070;
lcd_goto(0); // select first line
int2str(str_buf, freq);
lcd_puts(str_buf);
|
|
Дата: 04 Фев 2008 21:10:50 · Поправил: GenaSPB (04 Фев 2008 21:11:09)
#
// Перевод числа в строку
char *int2str(char *buf, unsigned long num)
{
char str[8];
char *ptr = &str[7];
int tmp;
int pos = 0;
*ptr = 0;
do {
if (++ pos == 1)
*--ptr = '.';
tmp = num / 10;
*--ptr = '0' + (num - tmp * 10);
num = tmp;
} while (num != 0);
while ((*buf++ = *ptr++) != 0);
return buf - 1;
}
Ну что-то такое?
|
|
Дата: 04 Фев 2008 21:43:23
#
Как сложить "строку" + "символ" + "строку" в си ?
|
|
Дата: 04 Фев 2008 21:59:48
#
тата
// Перевод числа в строку
char *int2str(char *buf, unsigned long num)
{
char str[8];
char *ptr = &str[7];
int tmp;
int pos = 0;
*ptr = 0;
do {
if (++ pos == 1)
*--ptr = '.';
tmp = num / 10;
*--ptr = '0' + (num - tmp * 10);
num = tmp;
} while (num != 0);
while ((*buf++ = *ptr++) != 0);
return buf - 1;
}
Ну что-то такое?
Попробовал, пишет: 10220. а надо 102.2
|
|
Дата: 04 Фев 2008 22:02:44
#
Ура заработало!
Вот правильно:
// Перевод числа в строку
char *int2str(char *buf, unsigned long num)
{
char str[8];
char *ptr = &str[7];
int tmp;
int pos = 0;
*ptr = 0;
do {
if (++ pos == 3)
*--ptr = '.';
tmp = num / 10;
*--ptr = '0' + (num - tmp * 10);
num = tmp;
} while (num != 0);
while ((*buf++ = *ptr++) != 0);
return buf - 1;
}
GenaSPB СПАСИБО!
|
|
Дата: 04 Фев 2008 22:49:41 · Поправил: Диня (04 Фев 2008 23:00:59)
#
Вот отлаженная функция,проверил на макс 999Мгц и мин 30 Мгц, отображается правильно:
unsigned int chanel;
unsigned long freq;
// Это для перевода числа встроку
char str_buf[8];
// Перевод числа в строку
char *int2str(char *buf, unsigned long num)
{
char str[7];
char *ptr = &str[6];
int tmp;
int pos = 0;
*ptr = 0;
do {
if (++ pos == 3)
*--ptr = '.';
tmp = num / 10;
*--ptr = '0' + (num - tmp * 10);
num = tmp;
} while (num != 0);
while ((*buf++ = *ptr++) != 0);
return buf - 1;
}
// Расчёт и вызов:
freq=chanel;
freq=freq*5-1070;
lcd_goto(0); // select first line
int2str(str_buf,freq);
lcd_puts(str_buf);
Чтоб было савсем красиво - вопрос теперь как к концу строки добавить MHz ?
|
|
Дата: 04 Фев 2008 23:07:28 · Поправил: GenaSPB (04 Фев 2008 23:24:45)
#
lcd_puts(str_buf);
Чтоб было савсем красиво - вопрос теперь как к концу строки добавить MHz ?
Я поступил бы так:
// Расчёт и вызов:
freq=chanel*5-1070;
lcd_goto(0); // select first line
int2str(str_buf,freq);
lcd_puts(str_buf);
lcd_puts(" MHz");
Но я бы пощадил оператора - лишняя информация будет мешать. Если бы это был прибор где то ли гигагерцы то ли мегагерцы - тогда еще можно представить.
Я не вдавался в подробности - размер внутреннего буфера (с учетом дополнительного знака - запятой) - достаточен для того, чтобы самое большое число вместить? В своем примере я увеличил относительно первоначального, потом вижу - Вы вернули назад...
Да, переменная tmp должна быть того же типа, что и num. в конкретном вашем случае (со входными отображаемыми числами до 999 МГц) - хватает и размера буфера и разрядности tmp. При расширении дальше программа начнет просто сыпаться и выдавать неправильные результаты.
Сейчас повнимательнее посмотрел - в выражении
(num - tmp * 10);
часть tmp * 10 не сможет превысить 32767 - в общем-то, результат непредсказуем. И то, что оно у Вас работает - значит очень повезло.
Прочитайте на досуге описание функция div/ldiv - это как раз Ваш случай - она одновременно выдает остаток от деления и частоное. Остаток выдаем в выходную строку, частное - опять становится делимым на следующей итерации (пока не кончится число). И не потребуется "восстанавливать" умножением значение десятичной цифры.
|
|
Дата: 04 Фев 2008 23:25:17
#
У меня chanel тип unsigned int, при старших значения он выходит за пределы, при умножении на 5, поэтому я переделал так:
с
freq=chanel*5-1070;
на
freq=chanel;
freq=freq*5-1070;
т.к. unsigned long freq;
Всё правильно добавил строчку:
lcd_puts("MHz");
Всё стало красиво, спасибо! Всё оказалось просто, я забыл, что указатель знакоместа автоматический смещается.
|
|
Дата: 05 Фев 2008 00:57:45 · Поправил: GenaSPB (05 Фев 2008 00:58:46)
#
А та проблема, которую ты решал присвоением номера канала делается так:
freq=chanel*5UL-1070;
Перед умножением на 5 chanel (Шанель? channel!) будет приводиться к типу unsigned long, а затем умножаться. Результат уже длинный остается и вычитание ПЧ уже идет как unsigned long.
Сделай обязательно еще
unsigned long tmp;
|
|
Дата: 05 Фев 2008 09:47:46
#
Да сделаю, спасибо!
|
|
Дата: 06 Фев 2008 11:48:52
#
Я хочу сделать этот приёмник в двух вариантах:
1 - подключать управление тюнером через софт SDR и далее: ноутбук - USB - COM - USART - PIC -I2C - тюнер, блок SDR задействован и выдаёт на аудио карту соответствующие каналы.
2- носимый, компактный - блок SDR не задействован, управление кнопками, отображение LCD, прослушивание через динамик / наушники.
В связи с этим вопрос, для второго варианта: есть у кого идеи переделать схему tda9809, без серьезных вмешательств, чтоб она смогла декодировать не только ЧМ, но и АМ , чтоб слушать авиадиапазон? Допустим я сделаю выход (TTL) и буду им управлять доработкой схемы?
В tda9809, в FM декодере есть выводы 9, 18, 11 есть идеи к ним чего то добавить для АМ?
|
|
Дата: 11 Фев 2008 09:23:56
#
Вчера поигрался на железе, частота отображается, сделал функцию чтения статуса тюнера, сделал 4-е состояния: 1. включение питания – «Привествие», 2. кнопки – канал вверх, вниз, 3 – сканирование вверх, 4-сканирование вниз. Намучался, казалось с элементарной вещью: сканирование кнопок. Оказалось, что я ошибся не в программе, а концептуально, т.е. я отдавал часть времени процессора на таймер сканирования (чтоб определить «нажатие» и «удержание»), но когда процессор занят на другие задачи, то таймер «уходит».
При считывании состояния тюнера Lock (захват), он срабатывает и от помех, сделал антидребезг (типа шумодова).
Сегодня постараюсь переделать процедуру сканирование кнопок, довести процедуру чтения статуса, сделать отключение звука без наличия Lock.
|
|
Дата: 12 Фев 2008 12:03:47
#
Моя тема уже никого не интересует? Никаких комментарий …. Все ждут готовую схему и прошивку? Но её пока нет.
Переделал алгоритм сканирование кнопок – заработало, попробовал вчера поигратся, результаты согласно datasheet fm1216, считал, что бит Р2 отвечает за подключение к Low band - антенный вход FM, но когда Р2 = 0, то ЧМ детектор отключается – на выходе тишина, когда Р2 = 1, то ЧМ детектор включён, антенный вход FM активен, при переходе на диапазоны Mid и High активным становить антенный вход ТВ, есть подозрение, что Р2 запараллелин с on/off ЧМ детектора и on/off антенным входом FM к Low band. Имхо если это так, то при переходе на Mid и High band, он подключен и возможно мешает, надо просмотреть схему и возможно отключить. Буду разбираться с Р7-Р2.
При сканировании, где то с 50 до 160 Мгц тюнер собирает помехи– свист, то ли с процессора, то ли от дисплея, то ли с I2C. Пока не знаю, как решить это: то в sleep падать, то ли паузы делать, то ли экранировать.
|
|
Дата: 12 Фев 2008 12:15:25
#
Диня
Все ждут готовую схему и прошивку? Но её пока нет.
Все ждут просто законченную конструкцию.
А вот меня еще и одолевает вопрос: зачем портить PC TV тюнер, если все управление делать заново на кнопках?
Чем тюнер лучше обычного приемного блока телевизора? Было бы еще интереснее именно переделать PC TV тюнер (по возможности минимальным образом) и получить приемник (SDR) с управлением от компа.
|
|
Дата: 12 Фев 2008 21:22:20
#
Интерес к теме есть, и очень большой. После прочтения веток об SDR приемниках на базе PC-шных и ТВ тюнеров решил стряхнуть пыль с компьютерного ТВ-тюнера Video Wonder Pro II V2 с FM каналом. После вскрытия обнаружилось, что тракт ПЧ реализован на м/с TDA9809. В Data Sheet на нее видно, что на 10 ногу выходит ПЧ 10.7 мгц. SDR я собрал по схеме SoftRock.6.2. Тюнер решил оставить в первозданном виде, управлять им при помощи программы FMradio. В результате долгих издевательств над ним было установлено:
Надо обязательно отключать АПЧ, т.к на NFM сигнал она не реагирует, а цепляется за всякую гадость и хаотично перестраивает тюнер. (я поднял 14 ногу м/с)
Желательно отключить АРУ: поднять 12 ногу, между дорожкой которая к ней подходила и GND включить резистор для ручной регулировки усиления.
В режиме FM-radio на частотах выше 110-120 мгц чувствительность безобразная, скорее всего где-то по входу стоит фильтр. Так как выпаивать тюнер не хотелось, найти и убрать фильтр не получилось.
После этого перестроил SDR тракт на 4,5 мгц (ПЧ звука) и решил посмотреть что творится там. После долгих мучений удалось несколько раз услышать репки в районе 450 мгц, но это явно не то, что ожидалось. Думаю, что причиной тому PLL, которая без наличия ТВ-сигнала хаотично перестраивает гетеродин в TDA9809. В программе- SDR декодере даже иногда видно, как несущая плавно смещается по частоте. Поэтому придется переделывать SDR на первую ПЧ и включаться до 9809. Но перед этим хотелось бы все-таки найти и убрать фильтр в FM-канале и посмотреть что из этого получится.
Диня, как я понял тюнер у вас скорее всего такой же, как и у меня, он выпаян, и вы можете взглянуть на обратную сторону платы.. Подскажите, где стоит фильтр и как его убрать.
|
|
Дата: 13 Фев 2008 09:36:08
#
Здравствуйте Александр!
Спасибо за нужную, интересную информацию, думаю, что у нас аналогичные тюнеры, вчера посмотрел входные цепи – много плотно расположенных элементов, проследить, что куда идёт сложно, но прослежу.
Предполагаю, что этот «фильтр» связан с тем, что включение режима «FM-тюнера» (бит Р2) запараллелино с переключением на «антенный вход FM», который «узкополосный» - его задача пропустить 64-108 МГц и если эту связь обрубить и вернуть на «широкополосный» ТВ антенный вход, то проблема решится. Была б схема вопрос 5 минут, а так придётся её срисовывать, иследовать. Подёргаю бит Р2 посмотрю осциллографом, на каких ключевых транзисторах - что меняется, расскажу.
|
Реклама Google |
|