Микроконтроллеры | Оцифровка сигнала [под управлением atmega] |
|
---|---|---|
ATMega16 управляет внешним АЦП TLV1570 по встроенному SPI и пытаемся оцифровать гармонический сигнал с частотами до 20кгц. Немного о TLV1570 - 8ми канальный 10ти разрядный последовательный АЦП 1.25MSPS. Входные напряжения: 0 .. 5В По теореме Котельникова, частота дискретизации: Fдиcкр > 2Fmax Т.е. мы укладываемся с головой. Частота дискретизации 250 кГц, а сигнал 20кГц Код прошивки такой: * я сначала собираю отсчеты по 100 точек и сохраняю их в буффер, а затем отправляю по UART на COM порт в ПК. (так быстрее производительность, т.к. отправка по уарту занимает значительное время) Просимулировал этот код в VMLAB, получил следующие тайминги: С учетом всех погрешностей на запись в переменные и т.п - получил, что снятие одного отсчета займет 10мкс - т.е. частота дискретизации 100кГц - все равно укладываемся. Итак, на практике вот что я получаю: Оцифровка сигнала частотой 10кГц амплитуда около 1В: Сразу же в настройках SPI выставил галочку SCLK x2 Rate - т.е. удвоили частоту тактирующего импульса (я предполагал что и качество оцифровки увеличится в 2 раза) Вот как получилось с этой настройкой: Мучил код, пробывал и так и сяк, симулировал.
Совсем не так как хотелось бы. * Сигнал с меньшей частотой оцифровывает прелестно. Вот пример оцифровки синуса с частотой 1кГц: Прошу помощи - оцифровкой занимаюсь в первый раз, как быть, вроде бы всё правильно - а на деле выходит совсем не то. Возможно код можно ещё как то более оптимизировать, или ещё где ошибку сделал? Прошу совета. |
|
|
Кусок инициализации SPI покажите. |
|
|
Инициализация SPI: PORTB=0x00; SPCR=0x54; * SPI без прерываний настроен - я пробывал и с прерываниями - результат одинаков. Для SPI SLCK x2 rate ствил: SPCR=0x54; |
|
|
ОК. Попробуйте еще обойтись без функции spi(...), т.е. реализовать обмен "руками" (в даташите по Меге16 есть подробное описание). Еще лучше бы написать этот кусок на ассемблере - по моим прикидкам у вас интервалы между обменами не должны превышать 16 команд, а с вызовом функции вы в них наверняка не уложитесь. |
|
|
На C уже пробывал "руками" как в даташите написано: SPDR=data; результат тот же |
|
Форум про радио — сайт, посвященный обсуждению электроники, компьютеров и смежных тем. pro-radio.online | Обратная связь |
© 2003—2024 |