PIC. Урок 17. MSSP. SPI. Внешний АЦП MCP 3201. Часть 1



Продолжаем изучение модуля MSSP, в частности его работу с шиной SPI. И сегодня мы уже поработаем с данной шиной на приём данных от устройства.

Для этого мы возьмём микросхему MCP3201. Эта микросхема является внешним аналого-цифровым преобразователем. Разработчиком данной микросхемы является компания Microchip Technology.

Данная микросхема не такая крутая, как может показаться на первый взгляд, скорость у неё не очень велика, но сигнал даже динамический в пределах 100 кГц она отследить может.

Но нам этого и не нужно. Нам данный внешний АЦП (ADC) поможет усовершенствовать наши навыки по работе и программировании шины SPI и заодно пообщаться по данной шине на приём.

Давайте изучим для начала основные технические характеристики данного преобразователя.

Частота тактирования по шине SPI может достигать 1,6 МГц при условии, что питаться микросхема будет от 5 вольт, а если она будет питаться от 2,7 вольт — то 0,8 МГц.

Если нам будут нужны какие-то ещё характеристики, то мы к ним вернёмся в процессе написания кода.

Данные от этой микросхемы принимаются с выхода Dout

 

 

Принимать данные от микросхемы мы будем на ножке SDI (RC4) нашего контроллера.

Подробно знакомиться вообще с технологией аналого-цифрового преобразования мы в рамках нашего урока не будем, но на всякий случай озвучу основное назначение — преобразование напряжения сигнала на входной ножке устройства АЦП в цифровой код. А более плотно с АЦП мы познакомимся в будущих уроках, когда будем изучать одноимённый модуль нашего контроллера.

Данные передаются в виде двух байтов, один старший, другой младший, так как АЦП у нас 12 битный и вся информация в рамках одного байта не уместится. И формат такой: в старшем байте идут пустые первые три бита, а в младшем пустой будет последний младший бит. Чтобы принять эти два байта, мы должны опустить ножку выбора микросхемы (CS) и начать тактирование. После приёма 16 бит мы прекращаем тактирование и поднимаем ножку CS. Конечно, насчёт тактирования нам беспокоиться не придётся, это возьмёт на себя модуль MSSP.

Вот назначение контактов нашей микросхемы

 

 

 

Здесь мы видим, что данная микросхема АЦП является 8-контактной, существует в корпусе DIP, а также в других различных корпусах. Мне, например, в руки данная микросхема попала в корпусе SOIC, поэтому пришлось применить недорогой и незатейливый переходничок, который мы увидим несколько позже, и сделать что-то наподобие DIP, чтобы воткнуть её в макетную плату, то есть получилось что-то наподобие маленькой табуретки.

Теперь ножки

 

 

Vref — это контакт для подачи опорного напряжения. То есть, подадим мы, например сюда пять вольт — и это будет наше максимальное напряжение.

In+ — это у нас аналоговый вход. На нём мы и измеряем наше напряжение.

In- — это вход для регулировки АЦП. То есть, если существует какая-то погрешность, то мы сюда подаём корректирующее напряжение от -100 миливольт до +100 миливольт.

Vss — общий провод.

CS/SHDN — ножка для выбора и отключения микросхемы.

Dout — ножка цифровых данных измеренного напряжения.

CLK — ножка синхронизации или тактирования.

Vdd — ножка питания от 2,7 вольт до 5,5 вольт.

 

Вот так вот рассчитывается цена градаций напряжения

 

 

А вот так, наоборот, по измеряемому и опорному напряжению рассчитывается информационная величина, которую мы получим из шины

 

 

Также микросхема поддерживает два режима передачи данных по SPI — режим 0:0 и режим 1:1, что нам, соответственно, придётся учитывать при конфигурировании шины в нашем коде.

 

 

Вот так производитель описал каждый режим в технической документации.

Первый режим (нажмите на картинку для увеличения изображения)

 

 

Второй режим (нажмите на картинку для увеличения изображения)

 

 

 

Теперь рассмотрим нашу практическую схему. Отладочная плата остаётся та же. Отслеживать измеренное напряжение на ножке внешнего АЦП мы будем при помощи 4-разрядного индикатора, вернее теперь не индикатора, а модуля с индикатором, производителем которого является тот же WireShare, что и отладочной платы.

 

 

Тем более, целесообразно использование данного модуля будет потому, что тянуть к нему провода нам не придётся, так как для него есть специальный разъём.

Подключим данный модуль в разъём платы

 

 

Теперь микросхема MCP3201. Она досталась мне в корпусе SOIC и, чтобы использовать для неё макетную плату, я применил нехитрый переходник, вследствие чего получилась вот такая вот «табуреточка»

 

 

Поместим микросхему с переходником в макетную плату.

 

 

В качестве источника тестового напряжения мы будем использовать нехитрый делитель на одном переменном резисторе на 10 килоом, который поместим в ту же макетную плату

 

 

С центральной ножки резистора подадим сигнал на входную аналоговую ножку микросхемы (2), а также подключим общий провод к резистору

 

 

В качестве опорного напряжения для простоты мы будем использовать напряжение питания, поэтому соединим ножки 1 и 8, а также подведём питание к делителю на резисторе. А ножку третью соединим с общим проводом, так как корректировать напряжение мы не собираемся

 

 

Подключим нашу схему к контроллеру к соответствующим ножкам. В качестве ножки CS у нас будет выступать ножка RC6, так как ножка RA5, предназначенная в модуле MSSP для этого, занята индикатором под точку. Также подведём от платы питание и общий провод

 

 

Также подключим логический анализатор для того, чтобы увидеть, как поступают данные по шине SPI

 

 

Подключим анализатор к ПК, также подключим к схеме программатор, который в свою очередь тоже подключим к ПК и наконец-то займёмся проектом.

Проект был сделан из проекта прошлого занятия LED7219 и назовём его MCP3201.

Откроем наш проект в MPLAB X, сделаем его главным, также убедимся в настройках, что контроллер будет питаться от программатора.

Удалим из проекта файлы для дисплея LED7219.h и LED7219.c.

А из проекта урока 7 добавим к проекту файлы для работы со светодиодным индикатором led.h и led.c.

Соответственно, в файле main.c исправим подключение библиотеки

 

#include «main.h»

#include «led.h»

 

Из функции main() удалим полностью весь код, оставив лишь пустой бесконечный цикл

 

void main()

{

  while(1)

  {

  }

}

 

Добавим макросы для ножки выбора микросхемы

 

#include "led.h"

//------------------------------------------------

//CS = RC6

#define CS_ON() PORTC &= ~0x40

#define CS_OFF() PORTC |= 0x40

//------------------------------------------------

 

Добавим переменную для счёта тиков таймера 0, а также стандартный обработчик его прерывания, необходимые для работы с динамической индикацией

 

#define CS_OFF() PORTC |= 0x40

//------------------------------------------------

unsigned int TIM1_Count=0;

//------------------------------------------------

void interrupt timer0()

{

  TIM0_Callback();

  T0IF=0;

}

//------------------------------------------------

 

Настроим порты на выход в функции main(), а также проинициализируем их ножки низким уровнем

 

void main()

{

  TRISB = 0x00;

  PORTB = 0xFF;

  TRISA = 0x00;

  PORTA = 0x00;

 

Проинициализируем и включим таймер

 

PORTA = 0x00;

OPTION_REG=0b00000010; //Prescaler

INTCON=0xA0;

TMR0=0;

 

Выведем пока тестовое число на индикатор

 

TMR0=0;

ledprint(1234);

 

В следующей части занятия мы напишем код нашего проекта и проверим его работоспособность в программе логического анализа, а также и на практической схеме.

 

 

Предыдущий урок Программирование МК PIC Следующая часть

 

 

Купить программатор (неоригинальный) можно здесь: PICKit3

Купить программатор (оригинальный) можно здесь: PICKit3 original

Отладочную плату PIC Open18F4520-16F877A можно приобрести здесь: PIC Open18F4520-16F877A

Индикатор 4-разрядный LED WaveShare можно приобрести здесь: LED WaveShare

Микросхема АЦП 12-разрядный MCP3201 — 10 шт можно приобрести здесь: MCP3201

Логический анализатор 16 каналов можно приобрести здесь

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

PIC MSSP. SPI. Внешний АЦП MCP 3201

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*