Весы своими руками

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Васнецов Аркадий
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Ср май 12, 2010 05:53:45

Весы своими руками

Сообщение Васнецов Аркадий »

Здравствуйте. Пишу программу для электронных весов, и отлаживаю в ПРОТЕУСЕ но так как в нем нет тензодатчика, то использую простой переменный резистор вместо датчика.
У меня такой вопрос:
Что нужно изменить в моем коде, чтобы вмето символов (которые изменяются при изменении сопротивления) на экране при нажатии кнопки появлялось текущее значение АЦП. Код и проект прилагаются:
Вот код:
#include <mega8.h>
// Функции Инициализации LCD
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>
#include <delay.h>
#define FIRST_ADC_INPUT 0 //Объявления для АЦП
#define LAST_ADC_INPUT 0
unsigned char adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
#define ADC_VREF_TYPE 0x20

interrupt [ADC_INT] void adc_isr(void)
{
static unsigned char input_index=0;
// Read the 8 most significant bits
// of the AD conversion result
adc_data[input_index]=ADCH;
// Select next ADC input
if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
input_index=0;
ADMUX=(FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff))+input_index;
// Прерывание для стабилизации АЦП и ноги AREF
delay_us(10);
// Начало преобразования АЦП
ADCSRA|=0x40;
}
void main(void)
{
PORTD.0=0x00; //Инициализация кнопки
DDRD.0=0xFF;
ADMUX=FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff);
ADCSRA=0xCC;
lcd_init(8); //Загрузка LCD
#asm("sei")
while (1)
{
if(PIND.0==1) //Если кнопка нажата, то вывод на экран текущего значения АЦП
{
lcd_gotoxy(0,0);
lcd_putchar(adc_data[0]);
}
};
}
Этот код мне нужен для даленейшего использования - преобразования, чтобы потом вывести формулу, которая будет расчитывать настоящую массу, а не результаты преобразования АЦП.
Заранее спасибо.
Вложения
Тензовесы в протеус.zip
Файл проекта и прошивка
(14.86 КБ) 188 скачиваний
Реклама
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Re: Весы своиим руками

Сообщение Meteor »

Ничо не понял кроме последнего.
Для того чтобы получить "настоящий" вес нужно, в идеале:
Поставить несколько эталонных масс и оторазить чего там будет.
Затем зная вес эталона можно найти такое число А, при котором А*rezult=P.
Затем проверяем на весах другой массы.
Это идеальное решение.
Неидеальность может вылезти например такая - нормировали по 10 кг. Взвешиваем и получаем 10 кг.
Ставим вес 8 кг получаем результат 9 кг. Тут неточность аналоговой части. И с ней придется бороться или аналогово или программно.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Реклама
Аватара пользователя
Fasterpast
Мучитель микросхем
Сообщения: 493
Зарегистрирован: Ср фев 14, 2007 12:07:58
Откуда: Москва
Контактная информация:

Re: Весы своими руками

Сообщение Fasterpast »

Нужно сначала "itoa" сделать, чтобы переменную в строку перевести, а потом эту строку выводить. Тогда будут голые данные с АЦП. Ну а самый действенный способ перевода показаний в массу - сделать таблицу, мне кажется.
Васнецов Аркадий
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Ср май 12, 2010 05:53:45

Re: Весы своими руками

Сообщение Васнецов Аркадий »

Дело в том, что когда я проверял прошивку в Proteus на дисплее вместо цыфр выводились символы, которые изменялись в зависимости от сопротивления (скачайте приложение и вы все поймете).
А мне нужно чтобы выводились цыфры, которые находятся в АЦП (при импульсах с датчика), после чего их нужно преобразовать так, чтобы в результате получился настоящий вес нагрузки.
Теперь надеюсь все понятно?

И насчет "itoa" можно по подробнее, а то я новичек в программировании.
Реклама
Эиком - электронные компоненты и радиодетали
kris95
Держит паяльник хвостом
Сообщения: 920
Зарегистрирован: Ср янв 07, 2009 19:30:23

Re: Весы своиим руками

Сообщение kris95 »

Meteor писал(а): найти такое число А, при котором А*rezult=P.
Ну это конечно в идеале. Я бы сказал что надо найти такую функцию f, при которой f(result)=P.
Реклама
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Re: Весы своими руками

Сообщение Meteor »

А можно заложить таблицу поправок на "кривизну" измерений к линейной или нелинейной функции.
ЗЫ Коэффициент А (в моем посте) как раз и является одним из элементов линейной функции y=A*x+b.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Реклама
holland.9
Открыл глаза
Сообщения: 74
Зарегистрирован: Чт июн 11, 2009 20:37:57
Откуда: Харьков

Re: Весы своими руками

Сообщение holland.9 »

подтяни PD0 к земле резистором,
и вот:

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

#include <mega8.h>
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>
#include <stdio.h>
#include <delay.h>
unsigned int adc_data;
char lcd_buffer[16];
interrupt [ADC_INT] void adc_isr(void){
adc_data=ADCW;
ADCSRA|=0x40;}
void main(void){
ADMUX=0b01000000;
ADCSRA = 0b11001111;
lcd_init(16);
lcd_clear();
#asm("sei")
while (1)
{adc_data=ADCH;
if(PIND.0==1){ //Если кнопка нажата, то вывод на экран текущего значения АЦП
lcd_gotoxy( 0,0 );
lcd_putsf( "   ADC 10bit " );
sprintf(lcd_buffer, "  %u     ",adc_data);
lcd_gotoxy(3,1);
lcd_puts(lcd_buffer);}
             
else { lcd_gotoxy( 0,0 );
       lcd_putsf( "     Ves " );
       sprintf(lcd_buffer, "%02i.%01ikg   ",adc_data*2/10,adc_data*2%10); //переводим в вес
       lcd_gotoxy(5,1);
       lcd_puts(lcd_buffer);}
}}
Васнецов Аркадий
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Ср май 12, 2010 05:53:45

Re: Весы своими руками

Сообщение Васнецов Аркадий »

:idea: Спасибо большое за ответы. Можно закрывать тему!!!:) :)))
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»