Весы на микроконтроллере, подключение HX711 к Atmega16.

Весы на микроконтроллере, подключение HX711 к Atmega16.

Уже давно стоят без дела вот таки весы.
Весы на микроконтроллере, подключение HX711 к Atmega16.

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

Эта микросхема содержит в себе усилитель, с программируемым коэффициентом усиления и сигма-дельта АЦП, она была специально разработана для применения в весах.

Назначение выводов:
  • VCC, GND - питание
  • DT, SCK — информационные выводы
  • Е+, Е- — питание тензомоста
  • А+, А- — дифференциальный вход канала А
  • В+, В- — дифференциальный вход канала В


Блок-схема выглядит следующим образом.
Весы на микроконтроллере, подключение HX711 к Atmega16.


Теперь давайте чуть подробнее рассмотрим интересующие нас параметры
  • 2-х канальный, 24-битный АЦП с дифференциальным входом
  • коэффициент усиления программируется и может быть равен 32, 64, 128
  • регулируемая частота выборок 10 или 80 в секунду
  • диапазон питающих напряжений от 2.7 до 5.5 вольт


Для получения данных используются 2 вывода: DT и SCK. Во время преобразования на выводе DT присутствует логическая единица, на SCK при этом должен быть логический ноль.

По окончании преобразования на выводе DT появляется логический ноль, который говорит о том, что данные можно забирать. Далее, по каждому положительному фронту на входе SCK, данные передаются по одному биту, старшим битом вперёд. По окончании считывания на выводе DT устанавливается логическая единица. Вот и весь протокол.

Что касается коэффициента усиления и выбора канала, то он зависит от количества импульсов на выводе SCK, как показано в таблице ниже.
Весы на микроконтроллере, подключение HX711 к Atmega16.

Причём надо сказать, что коэффициент усиления всегда программируется для следующей выборки. То есть если мы, считывая текущее значение, подадим на вывод SCK 26 импульсов, то следующее значение, которое мы считаем будет выборка с канала В с коэффициентом усиления 32.

Диапазон измеряемых напряжений зависит от коэффициента усиления, при коэффициенте усиления 128 измеряемое напряжение может изменяться от ±20mV, при коэффициенте усиления 64 — ±40mV и при коэффициенте усиления 32 — ±80mV, при этом подразумевается что на выводе AVDD(аналоговое питание) у нас 5 вольт. При выходе значения входного сигнала за нижнюю границу АЦП выдаст 800000h, за верхнюю 7FFFFFh.

Частота выборок зависит от напряжения на выводе RATE и от частоты тактового сигнала. При тактировании микросхемы от внутреннего генератора, нас интересует именно этот случай, частота выборок равна 10 в секунду при RATE=0 и 80 в секунду при RATE = DVDD(цифровое питание), на плате этот вывод посажен на землю.

На последних страницах даташита, приведена реализация протокола на С-51 и ассемблере, давайте подправим его для Atmega16.

#define F_CPU 8000000UL

#include <avr/io.h>

#define HX_PORT PORTB
#define HX_DDR  DDRB
#define HX_PIN  PINB

#define data 0
#define sck 1
//результат взвешивания
int32_t adc_value = 0;

void HX711_Init(void)
{   
	//sck выход, data - вход
	HX_DDR |= (1<<sck);
	HX_DDR &= ~(1<<data);
	
	//подтягиваем data к питанию, на sck устанавливаем лог.единицу
	HX_PORT |= (1<<data);
	HX_PORT &= ~(1<<sck);
}

uint32_t Weighing(void)
{
	uint8_t i = 0;
	adc_value = 0;

	HX_PORT &= ~(1<<sck);
	//ждём пока закончится преобразование
	while((HX_PIN & (1<<data)));
	
	for(i=0; i<24; i++)
	{
		//поднимаем строб
		HX_PORT |= (1<<sck);
		//сдвигаем значение АЦП влево, теперь значение АЦП выглядит так .......0
		adc_value <<= 1;
		//опускаем строб
		HX_PORT &= ~(1<<sck);
		//проверяем, что на выводе data, если ноль то самый правый символ так и останется ноль .......0
		//если 1, то самый правый символ будет один .......1
		if(HX_PIN & (1<<data))
		{
			adc_value++;
		}	
	}

	//выборки будем брать с канала А, с коэф.усиления 128
	//поэтому стробируем еще один раз
	HX_PORT |= (1<<sck);
	HX_PORT &= ~(1<<sck);
	
	return adc_value;
}

int main(void)
{

    HX711_Init();

    while(1)
    {
          Weighing(); 
    }
}

Схема подключения изображена ниже.
Весы на микроконтроллере, подключение HX711 к Atmega16.


Теперь давайте подключим тензометрический мост, взятый с весов.
Весы на микроконтроллере, подключение HX711 к Atmega16.

Весы на микроконтроллере, подключение HX711 к Atmega16.

Это значение — вес платформы, его всегда будем вычитать из полученного результата.

Поставим на весы крону.
Весы на микроконтроллере, подключение HX711 к Atmega16.

Весы на микроконтроллере, подключение HX711 к Atmega16.


Добавим ещё одну.
Весы на микроконтроллере, подключение HX711 к Atmega16.

Весы на микроконтроллере, подключение HX711 к Atmega16.


При измерении одного и того же груза, значения отличались на несколько сотен, но результат всё равно отличный.
Осталось найти пару гирек для калибровки и решить куда будем выводить результат, на lcd дисплей или на планшет с помощью bluetooth модуля, а пока на этом всё.

Даташит на HX711
комментарии
0