§ 38. WoodmanUSB. Компьютерный осциллограф на 48 МГц. (Часть 1)
|
Дмитрий Иванов, 10 Декабря 2013
|
|
Файлы к статье скачать
|
Имя: KA038.zip (ZIP архив) |
Размер: 170 КБ |
|
А вот наконец-то и самый настоящий пример использования модуля WoodmanUSB - компьютерный осциллограф. Данную тему я хотел бы разбить на несколько частей. В этой статье мы рассмотрим особенности построения USB компьютерных осциллографов и сделаем для начала самый простенький вариант осциллогара - анализатора сигнала прямоугольной формы (или логичнский 0 или 1).
Начнем с особенностей. Важно! - при использовании USB шины важно понимать, что время передачи пакетов данных по шине не нормируется и не может быть однозначно определено, т.е. временной интервал между пришедшими пакетами может легко варьироваться в широких пределах. В связи с этой важной особенностью в данных статьях будет использоваться следующая архитектура системы: в программе на PC запускается цикл чтения. На линию записи данных PB_WR модуля подается сигнал управления в виде меандра (пол периода лог. 1, пол периода лог. 0) с достаточно высокой частотой (до 48 МГц). При этом данные с линий порта PORTB (к которым подключен АЦП) будут помещаться в OUT_FIFO буфер, причем "врменной интервал" между записанными байтами будет равен периоду управляющего сигнала. Однако, можно будет точно утверждать, что точная временная синхронизация между байтами будет только в рамках каждых 512 байт. Рассмотрим этот момент подробнее. Например, буфер модуля пуст. Начинаем заполнять его данными с частотой тактового сигнала. Дошли до 512 байт. В этот момент пакет из этих 512 байт уходит на PC (512 байт - размер контрольной точки для модуля WoodmanUSB). Продолжаем записывать в модуль данные. Заполнили еще 512 байт. Этот пакет тоже ушел на PC. Теперь на компьютере у нас есть 1024 байт. Мы можем говорить о том что врмеменное расстояние между байтами в этом пакете равно переоду тактвого сигнала, кроме стыка двух 512 байтных пакетов (время Ttr), т.к. в течение этого временного промежутка происходила транспортировка предыдущего пакета на PC и заполнение буфера модуля следующими 512 байтами.
![](img/KA038/1.gif)
Давайте лучше рассмотрим реальный практический пример осциллографа, так легче будет понять. Для начала как я и говорил, сделаем самый простой прототип - микросхему АЦП использовать не будем. Мы будем подавать на линию PORTB7 (7 - ой бит порта PORTB) переодический имульсный сигнал, т.е. меандр (или логический 0 или 1). Кто будет подавать сигналы управления на линию записи данных PB_WR? - сам модуль. Работать будем в синхронном режиме с внутренним тактированием на 48 МГц. Т.е. модуль будет выдавать меандр с частотой 48 МГц на линию CLK, который мы подсоединим к линиии записи. Теперь мы получаем частоту дискретизации аж в 48 МГц! Согласитесь, это очень хороший результат. Также еще один важный момент - мы не будем анализировать факт переполнения буфера модуля. Дело в том что в данной задаче (осциллограф) потеря сигнала на некоторый промежуток времени вполне приемлима. Схема устройства представлена ниже, и она прямо скажем не замысловатая:
![](img/KA038/3.gif)
Теперь несколько комментариев по коду программы для PC. Основа программы по больщому счету уже нам хорошо знакома. Новведение здесь это собственно отрисовка прочтенных данных на экране. В начале каждого цикла чтения данных с помощью нашей собственной функции PrepareDraw() проводим подготовительные операции для рисования. При чтении каждого пакета из 64 КБ вызываем нашу функцию DrawGraph(), передав ей в качестве параметра адресс на буфер с прочтенными данными. Сама процедура отрисовки выполнена максимально просто. Отмечу только несколько моментов: Как видно по коду я не отрисовываю все 64 КБ данных - рисуются только первые XSIZE байт, но не более 512 байт. Почему так? Да дело в том что наши глаза могут "переварить" картинку которая меняется не чаще 25 раз в секунду. За одну секунду мы читаем около 400 пакетов по 64 КБ. Если мы формально будем отрисовывать все данные то это будет бестолку - мы их все равно не увидим. Сейчас картинка обновляется около 400 раз в секунду (при синхронном режиме с частотой 48 МГц), что конечно больше чем нужно. В процесе отрисовки картинки также рисуется маштабная сетка. В нижней части окна программы перед началом чтения даных показывается рассчитанная величина "ширины" клетки во временной области.
Какой сигнал можно использовать для анализа? Если у Вас есть стационарный НЧ генератор с возможностью генерирования прямоугольных импульсов - вопросв нет. Если Вы лишены этого прибора, для тестов можно превратить контроллер PIC в такой генератор. Например, вот так:
#include <pic.h>
__CONFIG(0x03F72);
void main(void)
{
TRISB = 0;
PORTB = 0;
while(1==1)
{
PORTB = ~PORTB;
}
}
Т.е. на выходах порта PORTB будет поперемнно присутвовать либо логический 0 либо 1. Для данной статьи я прошил PIC16F877 рассмотренным выше кодом и использовал для него кварцевый резонатр на 20 МГц. Прогнав на симуляторе этот код (хотя можно было и в ручную посчитать) получилось что период тактового сигнала генерируемого PIC`ом при кварце на 20 МГц будет равен 1.2 мкс (т.е. около 830 КГц).
Я взял схему на основе модуля и на вход линии PORTB7 модуля подал генерируемый сигнал от контроллера. Запустил программу и получил вот такой результат. Получается, что одна клетка примерно равна 530 нс. Если посмотреть на полученную картинку действительно получается что период анализируемого сигнала равен 1200 нс.
![](img/KA038/2.gif)
Данная программа лишена всяких там "прибамбасов" типа приближение/удаление, расчет длинны отдельных участков осциллограммы, сдвигов сетки и т.д. Она просто демонстрирует возможности модуля в качестве осциллографа на простеньком примере. Но все равно результат не плох на мой взгляд: мы получили осциллограф с частотой дискретизации 48 МГц что позволяет нам с хорошим разрешением наблюдать входные импульсные сигналы с частотой в несколько мегагерц. В следующих статьях мы добавим в схему быстродействующий АЦП чтобы можно было работать с сигналами произвольной формы.
© Дмитрий Иванов
09 Декабря 2013 года
http://www.kernelchip.ru