АЦП через LPT на чипе HX711

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

АЦП через LPT на чипе HX711

Сообщение nkp »

встретил на форуме емс ...
драйвер для АЦП HX711

Код: Выделить всё

component hx711 "Interface";

description """Crude Interface.  Reads analog data from HX711.""";

pin out bit SCK "SCK pin out";
pin in  bit DT  "DT input";
pin out  float output "output value";
pin in bit enable "Enable pin";
pin in bit reset "Reset pin (set channel A Gain 128)" ;
pin in bit select "select channel 0=ch.A gain 128, 1=ch.B gain 32";

function _ nofp;
license "GPLv2 or greater";
author "MK";

variable int ByteState = 0;
variable int BitState = 0;
variable int bnum = 0;
variable u32 TXByte;
variable int oldDT;
variable int waitcount = 0;
variable int chselect;

;;

enum Byte_state
    {
	eIdle               = 0,
	eWait               = 1,
	eRead		    = 2,
	eReset              = 3
    };
enum Bit_State
    {
	eIdleBit          = 0,
	eSCKLow           = 1,
	eSCKHigh          = 2,
	eResetBit         = 3
    };

FUNCTION(_)
{
	if (enable) {
		if (reset){
			ByteState = eReset;
		}
		chselect = (select==1) ? 26 : 25;
		
		// bytes
		switch (ByteState) {
		case eReset :
			BitState = eResetBit;
			break;
		case eIdle :
			BitState = eIdleBit;
			if (!DT && oldDT){
				ByteState = eRead;
				BitState = eSCKHigh;
				bnum = 0;
			TXByte = 0;
			}
		break;
		case eRead :
			if (BitState ==  eSCKHigh) {
			   if (bnum < 24){
				TXByte = (DT==1) ? (1 | TXByte << 1) : (TXByte << 1);
			   }
			bnum++;
			}
			if (bnum == chselect){
				output = TXByte;
				bnum = 0;
				ByteState = eIdle;
				BitState = eIdleBit;
			}
			
		break;
		default :
            		ByteState = eIdle;

                }
		// bits
                switch (BitState) {
                case eResetBit :
                        SCK=1;
                        waitcount++;
                        if (waitcount>=100) {
                                waitcount = 0;
                                BitState = eIdleBit;
				ByteState = eIdle;
			}
                break;
                case eIdleBit:
			SCK = 0;
		break;
		case eSCKLow :
			SCK = 1;
			BitState = eSCKHigh;
		break;
		case eSCKHigh :
			SCK = 0;
			BitState = eSCKLow;
		break;
		default :
		        BitState = eIdleBit;

                break;
                }



        }
	oldDT = DT;
}
и конфиг для пробы:
hx711.rar
(3.01 КБ) 483 скачивания

Код: Выделить всё

Описание:

- Два выбираемых дифференциальных входа 

- Программируемый коэффициент усиления 64,128 (канал А) и фиксированный 32 (канал Б)

- Автоматический сброс при включении питания 

- Выбор скорости передачи данных 10 Гц или 80 Гц

 

HX711 предназначен для датчика высокой точности 24 бит A / D. По сравнению с другими аналогичными чипами, данный имеет интегрированный генератор тактовой частоты и блок питания.

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

 

Легкость программирования: использует всего 2 любых входа/выхода 

 

Дифференциальное входное напряжение ±20мВ (при питании 5 В и усилении 128)

Напряжение питания: 2.6-5.5V DC

 

Есть библиотеки под Arduino и Raspberry pi.

https://github.com/bogde/HX711

https://github.com/ggurov/hx711

 

Характеристики:

- Разрешающая способность: 24 бит

- Напряжение питания:3-5V
плюс в том , что работает через парпорт ...
Аватара пользователя
PKM
Почётный участник
Почётный участник
Сообщения: 4263
Зарегистрирован: 31 мар 2011, 18:11
Репутация: 705
Настоящее имя: Андрей
Откуда: Украина
Контактная информация:

Re: Arduino EMC2 LinuxCNC - советы начинающим

Сообщение PKM »

Куда этот НХ711 приткнуть можно? В сети выдает сплошные весы на нем.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Arduino EMC2 LinuxCNC - советы начинающим

Сообщение Serg »

Весы - это 2 аналоговых сигнала, разницу между которыми надо померить и оцифровать. Вот померить и оцифровать это задача для HX711. Ну а что мерять - сам решишь. :)
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Arduino EMC2 LinuxCNC - советы начинающим

Сообщение Nick »

Я правильно понимаю, что подключаем SCK и DT к пинам скажем lpt, туда суем эту микруху и получаем 1 канал АЦП? Со скоростью примерно 1/24 потока?
Хммм. если там float убрать можно наверное даже в base thread запихать...

ЗЫ а почему в тему про ардуино?
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Arduino EMC2 LinuxCNC - советы начинающим

Сообщение nkp »

Nick писал(а):если там float убрать можно наверное даже в base thread запихать...
я это практически не пробовал - но так понимаю:
он шлет через пины lpt последовательный код аналового сигнала...
загружается в base thread:

Код: Выделить всё

loadrt hx711 
addf hx711.0 base-thread
net DT hx711.0.DT parport.0.pin-10-in
net SCK hx711.0.SCK parport.0.pin-09-out
loadrt limit3
addf limit3.0 servo-thread
net lim hx711.0.output limit3.0.in
setp limit3.0.maxa 10000000
setp limit3.0.maxv 1000000
setp  hx711.0.enable 1
ЗЫ а почему в тему про ардуино?
даже не знаю ;)
Ответить

Вернуться в «LinuxCNC»