Урок 65
Часть 2
Подключаем операционный усилитель TSZ124IPT
В предыдущей части занятия мы познакомились с характеристиками нашего ОУ, также познакомились с оценочной платой и со схемами, собранными на ОУ TSZ124IPT, а также с некоторыми расчётами данных схем, позволяющими нам оценить измеренные показания.
Проект мы сделаем из проекта Humidity_HTS221 из урока 55 по датчику влажности и назовем его TSZ124.
Запустим наш проект в Cube MX.
Посмотрим в документации на отладочную плату, какие именно мы будем использовать каналы АЦП
Так как на плате существуют две схемы использования нашего усилителя, подключенные своим выходом к двум различным каналам АЦП, то включим соответствующие каналы
Добавим ещё кое-какие забытые настройки. Включим генератор тактирования
Также включим порт SWD
I2C отключим
В Clock Configuration переключим мультиплексор на резонатор и установим следующие настройки (нажмите на картинку для увеличения изображения)
Перейдём в Configuration.
Настроим таймер следующим образом
Убедимся, что включены прерывания
В АЦП мы будем использовать инжекторные каналы, поэтому включим следующие настройки
Включим прерывания
Сгенерируем проект, откроем его в Keil, настроим там программатор на автоерезагрузку.
Файлы hts221.h и hts221.c переименуем соответственно в TSZ124.h и TSZ124.c.
В связи с этим также исправим и подключение файла в главном модуле main.c и в TSZ124.c, который мы также подключим в дерево проектов
#include «TSZ124.h»
В файле TSZ124.c удалим следующее объявление
extern I2C_HandleTypeDef hi2c1;
Функцию MovingAverageTemp исправим в MovingAverageI
Удалим функции Error, I2Cx_ReadData, I2Cx_WriteData, Humidity_IO_Read, Humidity_IO_Write, I2Cx_WriteData, Humidity_Get_Temp, Humidity_Get_Hum, Humidity_ReadID, HumidityInit и Humidity_Ini, а на какие из этих функций есть прототипы, то удалим и их. Функции инициализации мы удалили, так как операционным усилителям инициализация не нужна, так как это аналоговые микросхемы без всякого регистрового управления.
Функцию Humidity_Read переименуем в Data_Read, а весь код в ней пока закомментируем. Также добавим для неё прототип.
Также для эстетики исправим вот эту переменную
volatile int8_t avg_cnt;
volatile int8_t avg_cnt_i;
/* USER CODE END PV */
Также исправим данную переменную во всех местах её появления.
Теперь подчистим хедер-файл и он будет у нас следующего вида
#ifndef TSZ124_H_
#define TSZ124_H_
#include «stm32f4xx_hal.h»
#include <string.h>
//————————————————
void Data_Read(void);
//————————————————
#endif /* TSZ124_H_ */
Перейдём в главный модуль в функцию main() и в том месте, где у нас вызывается инициализация периферии, поменяем две функции местами, добавим ещё одну и уберём вызов функции чтения датчика
/* USER CODE BEGIN 2 */
HAL_ADCEx_InjectedStart_IT(&hadc1);
HAL_UART_Receive_IT(&huart2,(uint8_t*)str,8);
HAL_TIM_Base_Start_IT(&htim1);
Humidity_Ini();
Из бесконечного цикла уберём всё полностью.
изменим тип глобальной строковой переменной и добавим массив для хранения измеренных данных с двух каналов АЦП
/* USER CODE BEGIN PV */
/* Private variables ———————————————————*/
char str[20]={0};
volatile unsigned int i_cur[2];
/* USER CODE END PV */
В функции-обработчике прерываний от таймера исправим вызов функции Humidity_Read на Data_Read, но пока его закомментируем, так как мы сначала выведем наши показания в терминальную программу
if(huart2.RxXferCount==0)
{
// Data_Read();
После данной функции добавим ещё обработчик прерывания АЦП
void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef* hadc1)
{
i_cur[0]=HAL_ADCEx_InjectedGetValue(hadc1,ADC_INJECTED_RANK_1);
i_cur[1]=HAL_ADCEx_InjectedGetValue(hadc1,ADC_INJECTED_RANK_2);
HAL_ADCEx_InjectedStart_IT(hadc1);
}
/* USER CODE END 4 */
А в бесконечном цикле добавим вызов функции чтения показаний и задержку
/* USER CODE BEGIN 3 */
Data_Read();
HAL_Delay(200);
}
Вернёмся в TSZ124.c и подключим там нашу глобальную переменную
extern UART_HandleTypeDef huart2;
extern volatile unsigned int i_cur[2];
Теперь начнём потихоньку писать нашу функцию обработки данных АЦП, чтобы мы видели показания в нужных нам единицах.
Код будем делать из закомментированного, постепенно убирая знаки комментирования.
Сначала добавим в функцию две локальные переменные
void Data_Read(void)
{
float ins,i1;
Первая переменная будет для хранения рассчитанного значения разности потенциалов на входах измерительного усилителя, а вторая — для хранения текущего значения тока заряда.
Теперь попытаемся превратить сырое измеренное на АЦП на контакте A1 значение в величину разности потенциалов, используя наши формулы, приведённые выше. считать будем в миливольтах.
Так как максимальное значение — 4096 соответствует максимальному напряжениию 3,3 вольта или 3300 миливольт, то посчитаем форм-фактор (множитель) напряжения на выходе схемы
Считать пока не будем, чтобы слишком много не растерять на приближениях, посчитаем потом всё сразу.
Далее посчитаем форм-фактор для вычисления разности потенциалов на входных контактах.
Сначала выразим её из формулы, зная что неизвестное у нас множитель
Ну и, соответственно теперь посчитаем общий форм-фактор. Сначала с применением резистора (при установленной перемычке JP2)
А сейчас посчитаем форм-фактор того же усилителя, но без перемычки JP2, в этом случае у нас коэффициент усиления будет равен 1, то есть первый множитель в делителе будет равен единицы, следственно, его мы можем убрать из формулы совсем
Ну и теперь посчитаем также форм-фактор для вычисления тока
В следующей части занятия мы продолжим писать исходный код по обработке и отображению данных от ОУ и посмотрим данные показания в терминальной программе.
Предыдущая часть Программирование МК STM32 Следующая часть
Техническая документация:
Техническая документация на операционный усилитель TSZ124IPT
User Manual к оценочной плате X-NUCLEO-IKA01A1
Программа визуализации (Только для 64-битных Windows)
Отладочную плату можно приобрести здесь Nucleo STM32F401RE
Оценочную плату можно приобрести здесь STM32 X-NUCLEO-IKA01A1
Смотреть ВИДЕОУРОК (нажмите на картинку)
Добавить комментарий