Обзор датчика давления BMP180 (BMP080) – RobotChip
#include <SFE_BMP180.h>
#include <Wire.h>
SFE_BMP180 pressure; // Объявляем переменную для доступа к SFE_BMP180
void setup()
{
Serial.begin(9600); // Задаем скорость передачи данных
Serial.println(“REBOOT”); // Печать текста “Перезагрузка”
if(pressure.begin()) // Инициализация датчика
Serial.println(“BMP180 init success”); // Печать текста “BMP180 подключен”
else{ // В противном случаи, датчик не подключен
Serial.println(“BMP180 init fail\n\n”); // Печать текста “BMP180 не подключен”
while(1); // Пауза.
}
}
void loop()
{
char status;
double T,P,p0,a;
/* Так как давление зависит от температуры, надо сначало узнать температуру
* Считывание температуры занимает какоето время.
* Если все хорошо, функция pressure.startTemperature вернет status с количеством милисикунд
* которые нужно подождать. Ксли какае то проблема, то функция вернет 0.
*/
status = pressure.startTemperature(); // Считывание показания
if(status!=0){ // Если значение status не 0, выполняем следующию команду.
delay(status); // Ждем
status = pressure.getTemperature(T); // Полученые показания, сохраняем в переменную T
if(status!=0){ // Если все хорошо, функция вернет 1, иначе вернет 0
Serial.print(“Temperature: “); // Печать текста “Температура”
Serial.print(T,2); // Печать показания переменной “Т”
Serial.println(” C, “); // Печать текста “С”
/* Определяем показания атмосферного давления
* Параметр указывает расширение, от 0 до 3 (чем больше расширение, тем больше точность, тем долше ждать)
* Если все хорошо, функция pressure.startTemperature вернет status с количеством милисикунд
* которые нужно подождать. Ксли какае то проблема, то функция вернет 0.
*/
status = pressure.startPressure(3); // Считывание показания
if(status!=0){ // Если значение status не 0, выполняем следующию команду.
delay(status); // Ждем
status = pressure.getPressure(P,T); // Полученные показания, сохраняем в переменную P
if(status!=0){ // Если все хорошо, функция вернет 1, иначе вернет 0
Serial.print(“Absolute pressure: “); // Печать текста “Атмосферное давление”
Serial.print(P,2); // Печать показания переменной mBar
Serial.print(” mbar, “); // Печать текста “mBar”
Serial.print(P*0.7500637554192,2); // Печать показания в mmHg
Serial.println(” mmHg”);} // Печать текста “mmHg”
else Serial.println(“error retrieving pressure measurement\n”);} // Ошибка получения давления
else Serial.println(“error starting pressure measurement\n”);} // Ошибка запуска получения давления
else Serial.println(“error retrieving temperature measurement\n”);} // Ошибка получения температуры
else Serial.println(“error starting temperature measurement\n”); // Ошибка запуска получения температуры
delay(5000); // Пауза в 5с
}
Первым делом необходимо скачать документацию по выбранному микроконтроллеру. Достаточно зайти на сайт производителя и скачать Datasheet.
На первых страницах перечислены основные характеристики МК (русское описание).
Основные моменты, которые нам понадобятся:
- микроконтроллер содержит внутренний генератор на 4 MHz, так же можно подключить внешний кварц частотой до 20 MHz
- 16 ног микроконтроллера можно использовать как цифровые входы\выходы
- есть 2 аналоговых компаратора
- 3 таймера
- CCP модуль
- USART модуль
- 128 байт энергонезависимой памяти EEPROM
Схема расположения выводов:
Vdd — питание.
Vss — земля.
Это минимум, необходимый для работы МК.
Остаются доступными 16 ног МК. Не сложно посчитать, что использование каждой ноги каким-либо модулем уменьшает максимальное число используемых цифровых портов.
Компилятор
Как я уже писал в предыдущих статьях, самым простым и легким я посчитал компилятор JAL с IDE JALEdit.
Качаем JALPack, устанавливаем.
В этом паке содержаться все необходимые библиотеки, а так же примеры их использования.
Запускаем JALEdit. Открываем пример програмы для нашего микроконтроллера: 16f628a_blink.jal, дабы не портить исходник, сразу сохраняем ее в новый файл, к примеру, 16f628a_test.jal.
Весь код можно разделить на 4 блока:
- выбор МК и его конфигурация
include 16f628a -- подключение библиотеки нашего МК
--
-- This program assumes a 20 MHz resonator or crystal
-- is connected to pins OSC1 and OSC2.
pragma target clock 20_000_000 -- oscillator frequency
-- configuration memory settings (fuses)
pragma target OSC HS -- HS crystal or resonator
pragma target WDT disabled -- no watchdog
pragma target LVP disabled -- no Low Voltage Programming
pragma target MCLR external -- reset externally
--
- объявление переменных, процедур, функций
alias led is pin_A0
pin_A0_direction = output
- выполнение настроек и расчетов до основного цикла
enable_digital_io() -- переключение всех входов\выходов на цифровой режим
- бесконечный цикл основных действий МК
forever loop
led = on
_usec_delay(250000)
led = off
_usec_delay(250000)
Нажав F9 (или соответсвующую кнопку) программа скомпилируется в готовую прошивку, при этом будет видно сколько ресурсов МК будет задействовано:
Code :58/2048 Data:4/208 Hardware Stack: 0/8 Software Stack :80
Если прочитать комментарии, то станет ясно, что данная программа рассчитана на использование внешнего кварца 20MHz.
Так как у нас его пока нет, разберемся с конфигурацией и перепишем программу на использование внутреннего генератора.
Конфигурация
В разных микрокотнролерах существуют различные наборы конфигурационных битов. Узнать о назначении каждого бита можно в даташите (стр. 97).
В подключенной библиотеке каждому биту и каждому его значению присвоена читабельная переменная, остается только выбрать необходимые нам параметры.
-- Symbolic Fuse definitions
-- -------------------------
--
-- addr 0x2007
--
pragma fuse_def OSC 0x13 { -- oscillator
RC_CLKOUT = 0x13 -- rc: clkout on ra6/osc2/clkout, rc on ra7/osc1/clkin
RC_NOCLKOUT = 0x12 -- rc: i/o on ra6/osc2/clkout, rc on ra7/osc1/clkin
INTOSC_CLKOUT = 0x11 -- intosc: clkout on ra6/osc2/clkout, i/o on ra7/osc1/clkin
INTOSC_NOCLKOUT = 0x10 -- intosc: i/o on ra6/osc2/clkout, i/o on ra7/osc1/clkin
EC_NOCLKOUT = 0x3 -- ec
HS = 0x2 -- hs
XT = 0x1 -- xt
LP = 0x0 -- lp
}
pragma fuse_def WDT 0x4 { -- watchdog timer
ENABLED = 0x4 -- on
DISABLED = 0x0 -- off
}
pragma fuse_def PWRTE 0x8 { -- power up timer
DISABLED = 0x8 -- disabled
ENABLED = 0x0 -- enabled
}
pragma fuse_def MCLR 0x20 { -- master clear enable
EXTERNAL = 0x20 -- enabled
INTERNAL = 0x0 -- disabled
}
pragma fuse_def BROWNOUT 0x40 { -- brown out detect
ENABLED = 0x40 -- enabled
DISABLED = 0x0 -- disabled
}
pragma fuse_def LVP 0x80 { -- low voltage program
ENABLED = 0x80 -- enabled
DISABLED = 0x0 -- disabled
}
pragma fuse_def CPD 0x100 { -- data ee read protect
DISABLED = 0x100 -- disabled
ENABLED = 0x0 -- enabled
}
pragma fuse_def CP 0x2000 { -- code protect
DISABLED = 0x2000 -- off
ENABLED = 0x0 -- on
}
- OSC — конфигурация источника тактирования
может принимать 8 различных значений, 4 из которых нам могут понадобиться
- INTOSC_NOCLKOUT — внутренний генератор (4M Hz)
- HS — внешний высокочастотный кварц (8-20 MHz)
- XT = внешний кварц (200 kHz — 4 MHz)
- LP — внешний низкочастотный кварц (до 200 kHz)
- WDT — сторожевой таймер.
Основная работа этого таймера в том, что бы перезагрузить микроконтроллер когда он дотикает до конца.
Что бы перезагрузки не происходило, его нужно своевременно обнулять.
Таким образом при сбое счетчик таймера перестанет обнуляться, что приведет к сбросу МК. Иногда бывает удобно, но в данный момент нам это не потребуется. - PWRTE — очередной таймер.
При активации он будет сбрасывать МК до тех пор, пока питание не поднимется до нужного уровня. - BROWNOUT — сброс МК при падении питания ниже нормы.
- MCLR — активация возможности внешнего сброса МК.
При включении функции МК будет в постоянном резете до тех пор, пока на ноге MCLR (pin 4) не будет положительного напряжения. Для сброса МК достаточно установить кнопку, замыкающую pin 4 на землю.
- LVP — активация возможности программирования при низком напряжении.
При активации один цифровой вход переключится в режим LVP (pin 10). Если подать 5В на эту ногу, то МК перейдет в режим программирования. Для нормальной работы МК требуется держать на этой ноге 0В (подсоединить к земле).
Мы будем использовать программатор, использующий повышенное напряжение, потому LVP активировать не требуется. - CPD — защита EEPROM от считывания программатором.
- CP — защита FLASH (прошивки) от считывания программатором.
Изменим конфигурацию под себя:
pragma target clock 4_000_000 -- указываем рабочую частоту, необходимо для некоторых функций расчета времени
-- конфигурация микроконтроллера
pragma target OSC INTOSC_NOCLKOUT -- используем внутренний генератор
pragma target WDT disabled -- сторожевой таймер отключен
pragma target PWRTE disabled -- таймер питания отключен
pragma target MCLR external -- внешний сброс активен
pragma target BROWNOUT disabled -- сбос при падении питания отключен
pragma target LVP disabled -- программирование низким напряжением отключено
pragma target CPD disabled -- защита EEPROM отключена
pragma target CP disabled -- защита кода отключена
Моргаем светодиодом по нажатию кнопки
Модифицируем программу так, что бы светодиод моргал только тогда, когда зажата кнопка.
Решив данную задачу мы научимся работать с цифровыми портами как в режиме входа, так и в режиме выхода.
Цифровой выход
В режиме цифрового выхода МК может притягивать к ноге либо питание, либо землю.
Подключать нагрузку можно как к плюсу, так и к минусу. Разница будет лишь в том, когда и в какую сторону потечет ток.
В первом случае ток потечет от МК при установке единицы, а во втором — к МК при установке нуля.
Дабы светодиод зажигался от логической единицы, остановимся на первом варианте.
Для ограничения тока через ногу (максимально допустимо 25 мА на цифровой вход или 200 мА на все порты) установлен токоограничительный резистор. По простейшей формуле высчитываем минимальное значение в 125 Ом. Но так как предел нам не нужен, возьмем резистор в 500 Ом (а точнее ближайший подходящий).
Для подключения более мощной нагрузки можно использовать транзисторы в различных вариантах.
Цифровой вход
Возьмем вторую неиспользуемую нигде ногу — RB4 (pin 10, указанная в распиновке функция PGM отностися к LVP, который мы отключили).
В режиме цифрового входа микроконтроллер может считывать два состояния: наличие или отсутствие напряжения. Значит нам необходимо подключить кнопку так, что бы в одном состоянии на ногу шел плюс, а во втором состоянии — к ноге подключалась земля.
В данном варианте резистор используется в качестве подтяжки (Pull-up). Обычно для подтяжки применяют резистор номиналом 10 кОм.
Впрочем, подтягивающий резистор не всегда необходим. Все ноги PORTB (RB0-RB7) имеют внутреннюю подтяжку, подключаемую программно. Но использование внешней подтяжки куда надежнее.
Можно подключать не только кнопку, главное помнить о ограничении тока через МК.
Кнопка сброса
Пока не забыли, что мы активировали внешний сброс, добавим аналогичную кнопку на ногу MCLR (pin 4).
После нажатия такой кнопки МК начнет выполнение программы с нуля.
Прошивка
Присваиваем нашему светодиоду и кнопке переменные:
enable_digital_io() -- переключение всех входов\выходов на цифровой режим
--
alias led is pin_B5 -- светодиод подключен к RB5
pin_B5_direction = output -- настраиваем RB5 как цифровой выход
--
alias button is pin_B4 -- кнопка подключена к RB4
pin_B4_direction = input -- настраиваем RB4 как вход
led = off -- выключаем светодиод
Теперь присваивая переменной led значения 1 или 0 (on или off, true или false, другие алиасы..) мы будем подтягивать к нужной ноге МК или плюс, или минус, тем самым зажигая и гася светодиод, а при чтении переменной button мы будем получать 1 если кнопка не нажата и 0 если кнопка нажата.
Теперь напишем необходимые нам действия в бесконечном цикле (эти действия будут выполняться постоянно. При отсутствии бесконечного цикла МК зависнет):
forever loop
led = off -- выключаем светодиод
_usec_delay(500000) -- ждем 0,5 сек
if Button == 0 then -- если кнопка нажата, выполняем действия
led = on -- зажигаем светодиод
_usec_delay(500000) -- ждем 0,5 сек
end if
end loop
Задержка считается просто:
частота генератора у нас 4MHz. Рабочая частота в 4 раза меньше: 1 MHz. Или 1 такт = 1 мкс. 500.000 мкс = 0,5 с.
Компилируем прошивку:
Errors :0 Warnings :0
Code :60/2048 Data:4/208 Hardware Stack: 0/8 Software Stack :80
Теперь нам необходимо записать эту прошивку в МК, собрать устройство согласно схеме и проверить, что у нас все получилось как надо.
Программатор
Все таже схема:
Смотрим на распиновку:
- PGD — pin 13
- PGC — pin 12
- MCLR(Vpp) — pin 4
- Vdd — pin 14
- Vss — pin 5
Паяем…
Некачественная пайка — одна из основных проблем неработоспособности устройства.
Не повторяйте мои плохие привычки: не используйте навесной монтаж.
В качестве питания 5В в данном случае использовался хвост от старой PS/2 мыши, вставленный в разъем для мыши.
Подключаем к компьютеру.
Качаем и запускаем WinPic800.
Идем в Settings->Hardware, выбираем JDM и номер порта, на котором висит программатор
Нажимаем Hardware Test, затем Detect Device
Открываем нашу прошивку pic628a_test.hex
На вкладке Setting можно проверить, что конфигурационные биты выставлены верно, при желании тут же их можно изменить
Program All, затем Verify All
Если ошибок не возникло, продолжаем паять.
Результат
Финальная схема:
От программатора нам мешает только высокое напряжение (12в) на MCLR. Дабы не отпаивать весь программатор, можно отпаять только один провод… Или просто не подключать программатор к COM порту. Остальные провода нам мешать не будут (а подключенные питание и земля только упростят пайку).
Кнопку на MCLR паять можно по желанию, но подтяжка обязательна.
При повторном подключении программатора резистор необходимо будет убрать, иначе он подтянет 12в к питанию.
Результат работы можно увидеть на видео.
Итак, у нас получилось самое простое устройство на микроконтроллере: мигалка светодиодом.
Теперь нам необходимо научиться пользоваться всей оставшейся периферией, но об этом в следущей статье.
BMP180 подключение к Arduino | Технохрень
#include <SFE_BMP180.h>
#include <Wire.h>
// Объявим переменную для доступа к SFE_BMP180:
SFE_BMP180 pressure;
#define ALTITUDE 1655.0 // высота над уровнем моря по приколу в метрах
void setup()
{
Serial.begin(9600);
Serial.println(“REBOOT”);
// инициализация
if (pressure.begin())
Serial.println(“BMP180 init ok”);
else
{
// Если мы тут то что-то не срослось. Как правило косяки с подключением
Serial.println(“BMP180 init fail\n\n”);
while(1); // зависаем
}
}
void loop()
{
char status;
double T,P,p0,a;
// Если вы хотите знать давление воздуха, откорректированное по уровню моря, которое обычно используется в прогнозах погоды
// Вам надо знать уровень моря в вашей местности где проводится замер
// Ее и надо указать в константе ALTITUDE в начале кода
Serial.println();
Serial.print(“Уровень моря: “);
Serial.print(ALTITUDE,0);
Serial.print(” метров, “);
Serial.print(ALTITUDE*3.28084,0);
Serial.println(” футов”);
// Если вы хотите наоборот узнать высоту над уровнем моря, а давление вам известно
// надо указать текущее атмосферное давление. Как это сделать написано в конце кода.
// Так как давление зависит каким-тоо боком от температуры, надо сначала узнать температуру
// В BMP180 есть встроенный термометр. Замер температуры занимает некоторое время.
// Если все ровно, pressure.startTemperature вернет в status количество милисекунд,
// которое нужно подождать для замера температуры
// Если какой-то косяк с проводами, вернет 0
status = pressure.startTemperature();
if (status != 0)
{
// ждем:
delay(status);
// Получаем температуру, засовываем ее в переменную T:
// Функция вернет 1 если все ОК, 0 если не ОК
status = pressure.getTemperature(T);
if (status != 0)
{
// пишем температуру:
Serial.print(“температура: “);
Serial.print(T,2);
Serial.print(” градусов C, “); // в цельсиях
Serial.print((9.0/5.0)*T+32.0,2);
Serial.println(” градусов F”); // в фаренгейтах
// Определяем атм. давление:
// Параметр указывает разрешение, от 0 до 3 (чем больше разрешение, тем выше точность, тем дольше ждать).
// Если все ровно, pressure.startPressure вернет в status количество милисекунд,
// которое нужно подождать для замера атм. давления
// Если какой-то косяк то вернет 0
status = pressure.startPressure(3);
if (status != 0)
{
// ждем окончания замера:
delay(status);
// Теперь можно получить давление в переменную P.
//Функция вернет 1 если все ОК, 0 если не ОК.
status = pressure.getPressure(P,T);
if (status != 0)
{
// выводим все:
Serial.print(“абсолютное давление: “);
Serial.print(P,2);
Serial.print(” миллибар, “);
Serial.print(P*0.0295333727,2);
Serial.println(” дюймов ртутного столба”);
// датчик возвращает атм. давление, которое изменяется в зависимости от высоты датчика.
// Если мы хотим как в прогнозе погоды, то нужно сделать сомнительные вычисления
// Параметры: P = давленик с датчика в миллибарах, ALTITUDE = высота над уровнем моря в метрах.
// Результат: p0 = давление, откорректированное по уровню моря
p0 = pressure.sealevel(P,ALTITUDE);
Serial.print(“Давление по уровню моря: “);
Serial.print(p0,2);
Serial.print(” миллибар, “);
Serial.print(p0*0.0295333727,2);
Serial.println(“дюймов ртутного столба”);
// Или если вы хотите сделать наоборот и определить высоту над уровнем моря по известному давлению,
// Parameters: P = давление с датчика в миллибарах, p0 = давление, откорректированное по уровню моря.
// Результат: a = высота над уровнем моря в метрах.
a = pressure.altitude(P,p0);
Serial.print(“рассчитанная высота над уровнем моря: “);
Serial.print(a,0);
Serial.print(” метров, “);
Serial.print(a*3.28084,0);
Serial.println(” футов”);
}
else Serial.println(“ошибка получение давления\n”);
}
else Serial.println(“ошибка запуска получения давления\n”);
}
else Serial.println(“ошибка получения температуры\n”);
}
else Serial.println(“ошибка запуска получения температуры\n”);
delay(5000); // пауза 5 секунд.
}
Часы – будильник на микроконтроллере PIC16F628A.
Вашему вниманию предлагаются часы на МК PIC16F628A с точностью хода 30 секунд в год.
Давайте посмотрим схему, а потом будет длинный расказ о том, что есть в этих часах и как ими пользоваться.
Ну а теперь – обещанный расказ, итак:
-Реализовано 2 режима отображения часы-минуты и минуты-секунды. Переключение кнопкой “Инкремент“.
-При нажатии кнопки “Коррекция” часы переходят в режим коррекции секунд (секунды обнуляются кнопкой “Инкремент“). Следующее нажатие кнопки “Коррекция” переводит часы в режим коррекции минут (минуты увеличиваются кнопкой “Инкремент“). Ещё одно нажатие кнопки “Коррекция” – переход к коррекции часов (часы увеличиваются кнопкой “Инкремент“). Следующее нажатие кнопки “Коррекция” – возврат в режим отображения часов-минут.
-При нажатии кнопки “Будильник” часы переходят в режим отображения уставки будильника. В этом режиме кнопкой “Инкремент” включаем будильник. Включение подтверждается коротким звуковым сигналом и включается мигающая точка. Корректируется уставка будильника после нажатия кнопки “Коррекция“. После первого нажатия – минуты, после второго – часы (увеличиваются кнопкой “Инкремент“). После третьего нажатия – переход в обычный режим.
-В часах реализована функция коррекции посредством подстройки константы (режим подстройки включается при удержании кнопки “Коррекция” дольше 1-й секунды). По умолчанию константа равна 1032 микросекунды в секунду. При отставании часов константу увеличиваем (кнопка “Инкремент“) на величину отставания вычисленное в микросекудах за 1 секунду. Если часы спешат, константу уменьшаем (кнопка “Будильник“) по тому же принципу.
-Возврат в обычный режим осуществляется из режимов коррекции через 3 минуты после последнего нажатия любой из кнопок.
-При срабатывании будильника подаётся звуковой сигнал, который отключается нажатием любой из кнопок или автоматически через примерно 4 минуты (за 4 минуты вполне можно проснуться (Ох не факт, не факт… Прим. Кота.))
-При установке батареек соответственно схеме, часы продолжают идти при отключении от сети. Использованы 3 батарейки А3 для наручных часов.
Прошивку берем тут.
Исходники тут.
Печатная плата для индикатора 5620 тут.(от maverick5334)
Печатная плата для индикатора АЛС324 тут.(от maverick5334)
Все вопросы в Форум.
Как вам эта статья? | Заработало ли это устройство у вас? |
Эти статьи вам тоже могут пригодиться:
Описание Сроки доставки Цена и наличие в магазинах
8BIT FLASH MCU, SMD, TUBE42, 16F628 Series PIC16F Memory Size, Flash 3.5KB EEPROM Size 128Byte Memory Size, RAM 224Byte No of I/O Lines 16 Timers, No. of 3 PWM Channels, No of 1 Clock Frequency 20MHz Interface Type USART Voltage, Supply Min 3V Voltage, Supply Max 5.5V Termination Type SMD Case Style SOIC No. of Pins 18 Operating Temperature Range -40°C to +85°C Temp, Op. Max 85°C Temp, Op. Min -40°C Base Number 16 IC Generic Number 16F628 Logic Function Number 16F628A Memory Size 2KB Memory Type FLASH Microprocessor/Controller Features BOD, COMP, ICSP, POR, TIMERS, WDT No. of Bits 8 Packaging Type Tube RAM Size 224Byte Temperature Range, IC Industrial
Корпус SO-18, Ядро PIC, Максимальная частота ядра 20 МГц, Объём памяти программ 3.58 кБайт, Объём EEPROM памяти 128 Байт, Объём оперативной памяти 224 Байт, Интерфейсы UART/USART, Периферия Brown-out Detect/Reset, POR, PWM, WDT, Напряжение питания, min 3 В, Напряжение питания, max 5.5 В
Технические параметры
Ширина шины данных
Тактовая частота
Количество входов/выходов
Объем памяти программ
Тип памяти программ
Встроенные интерфейсы
Встроенная периферия
Напряжение питания
Рабочая температура
Техническая документация
Дополнительная информация
Datasheet PIC16F628A-I/SO
Datasheet PIC16F628A-I/SO
Выберите регион, чтобы увидеть способы получения товара.
— Выберите город — Москва Санкт-Петербург Белгород Волгоград Воронеж Гомель Екатеринбург Ижевск Казань Калуга Краснодар Красноярск Минск Набережные Челны Нижний Новгород Новосибирск Омск Пермь Ростов-на-Дону Рязань Самара Саратов Тверь Томск Тула Тюмень Уфа Челябинск ЯрославльВ статье пойдет разговор об одном из вариантов взаимодействия микроконтроллера PIC16F628A с микросхемой цифрового драйвера термопары — МАХ6675, на ассемблере. Микросхема имеет SPI интерфейс. Вообще давно хотелось сделать терморегулятор для старой, но до сих пор работающей духовки для выпечки пирогов. Все никак не мог определиться с датчиком температуры, но китайцы все решили за меня. Приобрел вот такой модуль на алиэкспресс.
Что такое SPI, вы можете прочитать в Сети. На эту тему есть очень много информации. Я же в данной статье постараюсь дать комментарии к выполнению кода программы получения данных о температуре с драйвера термопары МАХ6675.
Сначала посмотрим на фигуры 1а и 1b, взятые из документации на микросхему МАХ6675.
Рисунок 1а – протокол последовательного интерфейса. Рисунок 1б – синхронизация приема данных.
Исходя из этой информации, мы и будем генерировать на определенных шинах в определенные моменты времени необходимые логические уровни. Шина CS – прижатие шины к нулю воспринимается МАХ6675, как запрос на выдачу данных. SCK – шина тактовых импульсов. SO – шина вывода 16 бит информации. И так, сразу после инициализации регистров микроконтроллера на шине CS выставляем высокий уровень, вывод микроконтроллера, работающий на эту шину, конфигурируем на выход. На шине тактовых импульсов устанавливаем логический ноль, этот вывод контроллера также переключаем на выход. Вывод контроллера, работающего с шиной данных – SO, изначально конфигурируем, как цифровой вход. Для работы программы с МАХ6675 нам потребуются три регистра общего назначения. Count – регистр счетчика принятых байт, Dat_MAX6675_H – старший регистр данных, Dat_MAX6675_L – младший регистр данных, принятых с модуля температуры. Так же в программе присутствует замена текста:
1. #define SCK PORTA,3 2pin Выход тактовых импульсов
2. #define CS PORTA,4 ; 3pin Шина запроса на вывод данных
3. #define SO PORTA,5 ; 4pin Вход данных
PORTA,3 – полноценный вход/выход, PORTA,4 – вход и выход с открытым стоком. К этому выводу необходимо подключить подтягивающий резистор 5,1к. PORTA,5 – имеет только вход .
Все это хорошо, но программа уже подошла к тому месту, когда необходимо получить данные о температуре. Для начала мы записываем в регистр Count количество принимаемых байт – 16. Строки 86,87 к коде программы. В соответствии с фигурой 1b мы прижимаем шину CS, строка 88. Далее, хотя микросхема MAX6675 быстродействующая, делаем небольшую задержку на пару микросекунд, чтобы она успела сообразить, что от ее хотят (с китайцами глаз, да глаз нужен ). Две команды «nop» – строки 89, 90. Строка 91 – формируем передний фронт тактового импульса. Так как биты информации, полученные по последовательному интерфейсу с модуля, будем записывать в регистры Dat_MAX6675_L и Dat_MAX6675_Н путем сдвига влево с использованием флага переноса С, то сначала мы его сбросим – стр.92. Микросхема MAX6675 выводит информацию, начиная со старшего бита.
Далее проверяем значение принимаемого бита на шине SO — стр.93. Если на шине «0», то по метке shift переходим на сдвиг регистров Dat_MAX6675_L и Dat_MAX6675_Н влево. Если же на шине «1», то мы переводим флаг «С» в единичное состояние, сдвигаем регистры и тогда в младший байт младшего регистра Dat_MAX6675_L запишется единица. После принятия бита информации формируем задний фронт тактового импульса – стр.98. Далее проверяем количество принятых бит – стр.99, если счетчик еще не обнулился, то по метке Read_data возвращаемся за следующим информационным битом. После принятия всех 16 бит мы отпускаем шину CS (стр.102), разрешая тем самым следующее преобразование температуры в код микросхемой MAX6675.
Сведения о температуре находятся в середине 16ти битового кода – биты 14 – 3. То есть 12 бит. 3 и 4 биты это десятые доли градуса, но учитывая страну рождения данного девайса и рабочую температуру в 250 градусов, я решил с долями не связываться. 15й бит является пустым и всегда равен нулю. Интересен 2й бит – имеет нулевое состояние, когда термопара подключена и «1», когда термопара в обрыве. В данной программе нет проверки его состояния. Назначение нулевого и первого бита я не знаю. Итог всего сказанного — нам нужно выделить десять байт температуры. Это биты 14-5.
Пример Т=+579, в bin -0000 0010 0100 0011, после приема с 6675 это будет выглядеть так -01001000 01100000. Воспользуемся инструкциями сдвига вправо с обнулением флага заема/переноса. Нам надо удалить в никуда пять младших байт. В регистр счетчика записываем 5 (стр.104, 105). Сбрасываем флаг переноса – стр.106. Сдвигаем регистры вправо пять раз и в итоге получаем в регистрах Dat_MAX6675_Н и Dat_MAX6675_L число, соответствующее начальному — 0000 0010 0100 0011. Теперь останется конвертировать в двоично-десятичное, а дальше вывести на тот или иной индикатор. Успехов. К.В.Ю.
Скачать “Программа_MAX6675_с_микроконтроллером_PIC” Программа_MAX6675_с_микроконтроллером_PIC.rar – Загружено 128 раз – 207 KB
Обсудить эту статью на – форуме “Радиоэлектроника, вопросы и ответы”.
Просмотров:408
ЧАСЫ С ТЕРМОМЕТРОМ НА PIC16F628A
Часы построены на микроконтроллере PIC16F628A, в качестве датчика используется DS18B20, транзисторы BC212 управляют общими анодами семисегментного индикатора, также в состав схемы входят несколько пассивных элементов.
Устройство настраивается с помощью 4-х кнопок. Одна увеличивает, другая уменьшает значение, третья кнопка используется для входа в меню, а также переключает элементы меню. При выходе из меню настройки сохраняются в EEPROM контроллера. Если часы зависают по какой-то причине кнопкой сброса они могут быть перезапущены. Часы будут продолжать работать с последними сохраненными значениями. Микроконтроллер тактируется от внешнего кварца частотой 4МГц для более точного отсчета времени. PIC16F628 управляет дисплеем в режиме мультиплексирования. Индикаторы находятся под контролем одного типа транзистора – BC212.
Как известно точность хода частов зависит от многих факторов – кварцевого резонатора, конденсаторов, температуры самого микроконтроллера, а также от качества электронных компонентов. В этой схеме, точность часов может быть установлена с помощью программного обеспечения. Нам просто нужно измерить отклонение в секундах за час или более часа, расчитать значения используя формулу для расчета поправочного коэффициента и ввести эти значения в память контроллера при помощи меню. Если правильно рассчитать поправочный коэффициент, то ход часов будет точным.
Настройка часов, описание меню:
– ho: Установка часов 0-23
– nn: Установка минут 0-59
– dn: Установка месяца
– dd: Установка числа месяца
– dY: Установка года
– dt: Установка формата индикации месяца. Если 1 – буквами(JA FE ||A AP ||Y JU JL AU SE oc no dE), 2 – цифрами(01 02 03 04 05 06 07 08 09 10 11 12).
– tt: Задержка индикации времени. Значение переменной 2-99с
– td: Задержка индикации даты. Значение переменной 2-99с. В случае если равно нулю дата не показывается!
– tE: Задержка индикации температуры. Значение переменной 2-99с. В случае если равно нулю температура не показывается!
– Sh: Калибровка шестнадцатеричного значения (см. ниже)
– Sl: Калибровка шестнадцатеричного значения (см. ниже)
Примеры установки калибровок Sh/Sl:
Отставание на 30 секунд в 24 часа: 30/86400 = 0,000347
1000000 – (1000000 * 0,000347) = 999653 (в десятичной системе) = F40E5 (шестнадцатеричной)
В результате шестнадцатеричное значение 40E5 раскладываем на Sh=40, SL=E5
Отставание на 2 секунды в 1 час: 2/3600 = 0,000555
1000000 – (1000000 * 0,000555) = 999445 (в десятичной системе) = F4015 (HEX)
Sh=40, SL=15
Спешат на 15 секунд за 60 дней: 15/5184000 = 0,000002
1000000 + (1000000 * 0,000555) = 1000002 (в десятичной системе) = F4242 (HEX)
Sh=42, SL=42
Скачать прошивку и печатную плату
BMP180 является одним из датчиков серии BMP XXX. Все они рассчитаны на измерения атмосферного давления или атмосферного давления . BMP180 – это высокоточный датчик, разработанный для потребительского применения. Барометрическое давление – это ничто иное, как вес воздуха, приложенного ко всему. Воздух имеет вес, и везде, где есть воздух, ощущается его давление. Датчик BMP180 определяет это давление и выдает эту информацию на цифровой выход.Кроме того, температура влияет на давление, и поэтому нам нужны показания давления с температурной компенсацией. Для компенсации, BM180 также имеет хороший датчик температуры.
BMP180 Конфигурация контактов
BMP180 доступен в двух модулях. Один из них – пятиконтактный модуль, а другой – четырехконтактный модуль. С пятиконтактным модулем у нас есть дополнительный контакт + 3,3 В, который отсутствует в четырехконтактном модуле. Кроме этого функционирование такое же.
ПИН-код | Описание |
VCC | подключен к + 5V |
GND | Подключен к земле. |
ПДД | Serial Data pin (интерфейс I2C) |
SCL | Последовательный контакт синхронизации (интерфейс I2C) |
3,3 В | Если + 5V нет.Может питание модуля, подключив + 3,3 В к этому контакту. |
BMP180 Особенности
- Может измерять температуру и высоту.
- Диапазон давления: от 300 до 1100 гПа
- Высокая относительная точность ± 0,12 гПа
- Может работать на низких напряжениях
- Интерфейс I2C 3,4 МГц
- Низкое энергопотребление (3uA)
- Время преобразования давления: 5 мсек
- Питьевой размер
BMP180 Технические характеристики
- Рабочее напряжение БМП180: 1.3 В – 3,6 В
- Входное напряжение BMP180MODULE: от 3,3 В до 5,5 В
- Пиковый ток: 1000 мкА
- потребляет 0.1uA в режиме ожидания
- Максимальное напряжение на SDA, SCL: VCC + 0,3 В
- Рабочая температура: от -40ºC до + 80ºC
BMP180 Эквиваленты
BMP280, BMP085 и т. Д.
Где использовать BMP180 МОДУЛЬ
Есть много причин, почему BMP180 предпочтительнее других модулей, вот несколько причин
Case1: Где вам нужно точное атмосферное давление.На многих модулях, представленных на рынке, BMP180 более точно измеряет атмосферное давление.
Case2: Где потребление энергии является проблемой. BMP180 MODULE потребляет очень мало энергии для работы. Таким образом, этот модуль можно использовать в системах, работающих от батареи, таких как умные часы и мобильные телефоны.
Case3: Где необходима высокоскоростная связь. МОДУЛЬ BMP180 способен взаимодействовать с высокоскоростным интерфейсом TWI.
Благодаря измерению высоты, высокоскоростному датчику и датчику температуры на борту использование модуля BMP180 продвигается даже дальше, чем другие модули.
Как использовать BMP180 МОДУЛЬ
Как видно из PIN-диаграммы. Для связи с модулем имеется только два контакта. И это сообщение является интерфейсом I2C. Данные отправляются в модуль или принимаются от модуля через интерфейс I2C. Таким образом, мы должны получить информацию о барометрическом давлении и температуре через этот интерфейс. Типичная принципиальная схема BMP180 с ARDUINO показана ниже.
Как показано на принципиальной схеме, модуль подключен к источнику питания + 5 В или к выводу ARDUINO UNO Vout.Модуль может работать при регулируемой мощности + 5В, а более высокое напряжение может повредить модуль. Интерфейс I2C установлен, как показано на рисунке. Все, что вам нужно сделать, это подключить SDA PIN модуля к SDA PIN ARDUINO и SCL PIN модуля к SCL ARDUINO.
Несмотря на то, что подключение к сенсорному модулю BMP180 легко, установить связь с ним нелегко. Обмен данными между контроллером ARDUINO и модулем действительно сложен. Обычно для отправки информации в модуль или получения информации от нее мы должны следовать протоколу.Этот протокол представляет собой последовательность шагов, которые необходимо выполнить без ошибок. Эти шаги сложны для начала. Поэтому использование библиотек, предварительно написанных для модуля, является идеальным. Использование библиотек облегчает общение. Все, что вам нужно сделать, это загрузить эти библиотеки и вызывать их в программах. Как только файл заголовка включен, ARDUINO автоматически следует протоколу и декодирует необходимые данные. Как только эти данные станут доступны, мы сможем выполнять желаемые функции.
Следовательно, используя библиотеки, мы можем легко использовать модуль BMP180.
Приложения
- Внутренняя навигация
- Спортивные устройства
- Компьютерная периферия
- GPS
- Прогноз погоды
- Индикация вертикальной скорости
- хобби проектов
2D-модель
Измерения в миллиметре
,
LowPowerLab / SFE_BMP180: BMP180 Библиотека датчиков Bosch
перейти к содержанию Зарегистрироваться- Почему GitHub?
Особенности →
- Обзор кода
- Управление проектами
- Интеграция
- Действия
- Пакеты
- Безопасность
- Управление командой
- Хостинг
- Отзывы клиентов →
- Безопасность →
- команда
- предприятие
- Проводить исследования
- Исследуйте GitHub →
учиться и внести свой вклад
- Темы
- Коллекции
- Тенденции
- Learning Lab
- Руководства с открытым исходным кодом
Общайтесь с другими
- События
- Почему GitHub?
Особенности →
- Обзор кода
- Управление проектами
- Интеграция
- Действия
- Пакеты
- Безопасность
- Управление командой
- Хостинг
- Отзывы клиентов →
- Безопасность →
- команда
- предприятие
- Проводить исследования
- Исследуйте GitHub →
учиться и внести свой вклад
- Темы
- Коллекции
- Тенденции
- Learning Lab
- Руководства с открытым исходным кодом
Общайтесь с другими
- События
- Общественный форум
Листы данных | PIC16F627A, 628A, 648A Справочная информация 6288 Справочник по программированию (NIC) 9286 Справочник по функциональным возможностям 9688 Справочная информация по тестированию NIC 9000 Справочная информация 9000 Справочная информация 816 Справочная информация по спецификации MPLAB® ICE2000 Spec | |||
---|---|---|---|---|
Фото продукта | 18-DIP (300 миль) _SDIP18 Pkg 18-DIP | |||
обучающие модули по продукту | асинхронный стимул 8-битный PIC®-микроконтроллер 005 Ресурсы 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200 Селектор средств разработки | |||
PCN Сборка / Происхождение | Редакция квалификации 23 / август / 2013 Квалификация SPDIP-28L, PDIP-8 / 16L 18 / сентябрь / 2013 Квалификация, редакция 18 / Dec / 2013 Квалификация, редакция 06 / Фев / 2014 Квалификационная медная проволока 17 / Март / 2014 Квалификационная медная проволока 17 / июнь / 2014 | |||
PCN Упаковка | Изменения в маркировке и упаковке 23 сентября 2015 г. | |||
Стандартный пакет | 25 | |||
Категория | Интегральные микросхемы (ИС) | |||
Embedded встраиваемых микросхем | ||||
Серия | PIC® 16F | |||
Упаковка | Трубка | |||
Процессор с сердечником | PIC | |||
Размер ядра | 8-бит | |||
Скорость 1000000M | Подключение | UART / USART | ||
Периферийные устройства | Обнаружение / сброс с отключением, POR, PWM, WDT | |||
Количество входов / выходов 90 006 | 16 | |||
Объем памяти программ | 3.5KB (2K x 14) | |||
Тип памяти программы | FLASH | |||
Размер EEPROM | 128 x 8 | |||
Размер оперативной памяти | 224 x 8 | |||
Напряжение питания – Питание (Vcc / Vdd) | 3 В ~ 5,5 В | |||
Преобразователи данных | – | |||
Тип генератора | Внутренний | |||
Рабочая температура | -40 ° C ~ 85 ° C | |||
18-DIP (0.300 “, 7,62 мм) | ||||
Комплект устройства поставщика | 18-PDIP | |||
Интернет-каталог | PIC® 16F | |||
Для использования с | ||||
Другие имена | 2 PIC16F
Важная информация об условиях интегральной микросхемы
1. Все микросхемы являются совершенно новыми, высококачественными компонентами: абсолютно никаких использованных предметов или подделок.
2. Товары, отправленные Андерсом, проверяются на внешний вид, упаковку и стабильность.
3. Изображения только для справки. Точные спецификации должны быть получены из таблицы.
4. Как правило, большинство микросхем произведено в последние годы и получило одобрение RoHS.
5. Цены, характеристики и наличие всех предметов могут быть изменены без предварительного уведомления.
6. Мы не несем ответственности за опечатки.
Условия оплаты
– Мы принимаем платежи через Escrow, Western Union, Money Gram или Telegraphic Transfer.
– Вы также можете внести платеж на наш бизнес-счет, но для его оплаты требуется больше средств.
– Поскольку вы успешно произвели оплату, вы можете отправить нам номер ссылки или номер MTCN.
Бесплатная доставка предоставляется DHL, Fedex, UPS, если сумма превышает 200,00 долл. США
Доставка
– Мы стремимся обработать ваш заказ как можно скорее. Большинство заказов доставляются в течение 2 дней после подтверждения оплаты.
– Посылки могут быть отправлены UPS / FedEx / DHL / TNT прямо на ваш экспресс-счет.
– Мы не несем ответственности за потерянные, задержанные, поврежденные посылки или другие проблемы, связанные с доставкой.
Страна | Прибл. Время доставки | |
Почта Гонконга Air-Mail | США, Великобритания, Австралия | 7-14 рабочих дней |
Канада, Западная Европа, Северная Европа, Центральная Европа | 7-21 рабочих дней | |
Другая страна | 15-30 рабочих дней | |
UPS или DHL | Северная Америка, Австралия, Западная Европа, Северная Европа, Центральная Европа | 3-7 рабочих дней |
Другая страна | 5-10 рабочих дней |
Гарантия
Гарантия предоставляется на основании следующих пунктов:
1.Интегральные схемы гарантированы в течение 60 дней.
2. Мы принимаем товары к обмену при условии, что
– Недостаточное количество или не соответствующие товары
– Используемые компоненты или дефект качества.
Гарантия не входит:
1. Техническая поддержка по удобству использования продукта.
2. Советы по настройке продукта.
3. Обновление программного или микропрограммного обеспечения, поскольку это приведет к аннулированию гарантии.
4. По истечении 60 дней после отправки товара.
5.Сломан из-за доставки.
6. Стихийные бедствия, техногенный ущерб, непрофессиональный снос, ошибки технического обслуживания.
Условия возврата
1. За все исправные детали взимается плата за пополнение запаса в размере 20-30%, определяемая по усмотрению IC Parts Depot.
2. На основе возвращаемого товара все возвращаемые товары должны быть на 100% завершены.
3. Дефектные предметы должны быть возвращены в IC Parts Depot в течение десяти (10) рабочих дней с момента получения продукта.
4. Покупатель несет ответственность за транспортные расходы, связанные с возвратом товара.
5. Клиенты должны застраховать все возвращаемые продукты от потери или повреждения во время транспортировки данного продукта.