Интернет-магазин

Просмотр корзины
В корзине:

товаров - 0 шт.



§ 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 байтами.

Давайте лучше рассмотрим реальный практический пример осциллографа, так легче будет понять. Для начала как я и говорил, сделаем самый простой прототип - микросхему АЦП использовать не будем. Мы будем подавать на линию PORTB7 (7 - ой бит порта PORTB) переодический имульсный сигнал, т.е. меандр (или логический 0 или 1). Кто будет подавать сигналы управления на линию записи данных PB_WR? - сам модуль. Работать будем в синхронном режиме с внутренним тактированием на 48 МГц. Т.е. модуль будет выдавать меандр с частотой 48 МГц на линию CLK, который мы подсоединим к линиии записи. Теперь мы получаем частоту дискретизации аж в 48 МГц! Согласитесь, это очень хороший результат. Также еще один важный момент - мы не будем анализировать факт переполнения буфера модуля. Дело в том что в данной задаче (осциллограф) потеря сигнала на некоторый промежуток времени вполне приемлима. Схема устройства представлена ниже, и она прямо скажем не замысловатая:

Теперь несколько комментариев по коду программы для 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 нс.


Данная программа лишена всяких там "прибамбасов" типа приближение/удаление, расчет длинны отдельных участков осциллограммы, сдвигов сетки и т.д. Она просто демонстрирует возможности модуля в качестве осциллографа на простеньком примере. Но все равно результат не плох на мой взгляд: мы получили осциллограф с частотой дискретизации 48 МГц что позволяет нам с хорошим разрешением наблюдать входные импульсные сигналы с частотой в несколько мегагерц. В следующих статьях мы добавим в схему быстродействующий АЦП чтобы можно было работать с сигналами произвольной формы.


© Дмитрий Иванов
09 Декабря 2013 года
http://www.kernelchip.ru



© KERNELCHIP 2006 - 2024