Перейти к содержанию

Atmega128 + Датчик Угла Поворота


XXXL

Рекомендуемые сообщения

Датчик имеет семь параллельных выходов их я подсоединил к контроллеру и считываю их значение. Проблема в том что при изменении положения датчика считывание происходит неккоректно вплоть до остановки движения датчика и ещё секунды две. И только после двух секунд после остановки контроллер считывает верное значение. Сначала думал что сам датчик обладает какой то инерцией, но проверил его и оказалось что он работает практически мгновенно. Судя по всему просто считывание значений параллельного парта проходит слишком медленно. Хотя я не понимаю почему. Есть ещё вариант что задержка в отображениии этого значения, которое контроллер передает по SPI на индикатор. Может кто нибудь что то посоветовать?

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Че за датчик? Каким образом происходит преобразование угла в код в датчике (механика, электроника)? Да и код проги выложить не мешало бы, ежели не секретный...

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

вот код программы. А датчик оптический, как я понял в нем какие то слои с чередующимися прозрачными и непрозрачными полосами. Для каждого вывода свой слой. Вывод первый на половину прозрачный, на половину нет. Второй разделен на четыре чередущихся сегмента. Третий на восемь, четвертый на 16 и т.д. И каждый из них соединен со своим выводом через какой то фотоэлемент. И выводов 10 , а не 7 как я написал. Первые 8 я считываю сразу с порта А, а два старших я подцепил к порту D. Потом получившееся число я передаю на экран по цифрам - тысячи на четвертый индикатор, сотни на третий, десятки на второй и еденицы на первый.

#include <MEGA128.h>

#include <delay.h>

#include <stdio.h> // Standard Input/Output functions

unsigned int uart_data, uart_dataD;

unsigned int Tisyachi;

unsigned int Sotni;

unsigned int Desyatki;

unsigned int Edenici;

void Init_Master (void)

{

volatile char IOReg;

// set PB0(/SS), PB2(MOSI), PB1(SCK) as output

DDRB = 0x07;

PORTB = 0x01;

// enable SPI in Master Mode with SCK = CK/4

SPCR = 0x51;

IOReg = SPSR;

IOReg = SPDR;

}

/********************************/

void Master_Send (unsigned char adres,unsigned char Data) //отображения числа DATA на индикаторе № adress

{

PORTB=0x0;

SPDR = adres;

while (!(SPSR & (1<<7)));

SPDR = Data; // send Character

while (!(SPSR & (1<<7)));

PORTB=0x01;

}

//-----------------------------------------------------------

void init_ekran(void) //инициализация экрана

{

// Master_Send (0x0F,0x01); //команда "тест"

// delay_ms(1000);

Master_Send (0x0F,0x00); //закончить тест

Master_Send (0x0C,0x01); //выключить шутдаун

Master_Send (0x09,0xFF); //включить декодирование

Master_Send (0x0A,0xFF); //яркость - на максимум

Master_Send (0x0B,0x03); //сканируем 4 разрядов

}

/********************************/

void main(void)

{

Init_Master (); // Initialization (polling)

init_ekran();

DDRA=0x00;

PORTA=0x00;

DDRD=0x00;

PORTD=0x00;

while (1)

{

Tisyachi=0;

Sotni=0;

Desyatki=0;

Edenici=0;

uart_data= PINA;

uart_dataD=PIND;

uart_data=uart_data+(uart_dataD&0x01)*256+( uart_dataD&0x02)/2*512;

Tisyachi=uart_data/1000;

uart_data=uart_data- Tisyachi*1000;

Sotni=uart_data/100;

uart_data=uart_data- Sotni*100;

Desyatki=uart_data/10;

uart_data=uart_data- Desyatki*10;

Edenici=uart_data;

Master_Send (0x04,Tisyachi);

Master_Send (0x03,Sotni);

Master_Send (0x02,Desyatki);

Master_Send (0x01,Edenici);

}

}

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

1. Входы не подтянуты, т.е висят в воздухе и их может колбасить по этой причине. Лучше PORTA=0xFF; PORTD=0x03; и т.д. Либо к земле притянуть через резисторы 10кОм. Потом не забыть учесть в коде получившиеся уровни...

2. Зачем в вечном цикле каждый раз обнулять переменные тысяч, сотен и т.д.?

3. Частота опроса не высокой ли будет? Индикатор достаточно 2-4-е раза в секунду обновлять... Соответственно и входы опрашивать так же...

4. Не помешал бы простеший программный антидребезг:

...
void main(void)
{ ...
while (1)
{ ...
uart_data= PINA;
uart_dataD=PIND;
delay_ms(15);
if ((uart_data==PINA)&(uart_dataD==PIND)) // как-то так, если компилятор поймет правильно, или двумя if-ми...
	   {
//далее по тексту...
	 delay_ms(250); //чтобы опрашивать пореже...
	   };
	   }
	   }

5. Код обмена с дисплеем не смотрел, но время обмена можно оценить, зажигая светодиод до него и гася после...

PS. При преобразовании в двоично-десятичный код у Вас очень много операций деления, которые отнимают много времени. Я сделал бы так:

//вместо:

// Tisyachi=uart_data/1000;
// uart_data=uart_data- Tisyachi*1000;
// Sotni=uart_data/100;
// uart_data=uart_data- Sotni*100;
// Desyatki=uart_data/10;
// uart_data=uart_data- Desyatki*10;
// Edenici=uart_data; 

//сделал бы так:

decbin(uart_data);

//где decbin()-быстрая функция преобразования без операций деления:

void decbin (unsigned int x) {
unsigned int i;
T=0; //-те же Tisyachi, только писать короче...
S=0;
D=0;
E=0;

for (i=x; i>=1000; i=i-1000) {T++;}; // T-тысячи
for (i=x-1000*T; i>=100; i=i-100) {S++;}; //S-сотни
for (i=x-1000*T-100*S; i>=10; i=i-10) {D++;}; //D-десятки
for (i=x-1000*T-100*S-10*D; i>=1; i=i-1) {E++;}; //Е-единицы
}

Изменено пользователем Goodefine

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

Ссылка на комментарий
Поделиться на другие сайты

1. Входы не подтянуты, т.е висят в воздухе и их может колбасить по этой причине. Лучше PORTA=0xFF; PORTD=0x03; и т.д. Либо к земле притянуть через резисторы 10кОм. Потом не забыть учесть в коде получившиеся уровни...

я пробовал так, но почему то тогда контроллер считывал совсем не правильно. Везде еденицы видел. Что значит - учесть в коде получившиеся уровни?

Ссылка на комментарий
Поделиться на другие сайты

Единицы он видел потому что при такой конфигурации входы соединены с плюсом (1) через внутренние резисторы, а "нули" c датчика не могут "перешибить" эти единицы. Чтоб разобраться с проблемой, хотелось бы увидеть электрическую схему датчика, а именно - как подключены оптопары к выходам, хотя бы для одного...

Можно попробовать висящие входы соединить с землей через резисторы 10кОм...

Учесть в коде то и означает, что при, скажем, засвеченной оптопаре при подтяжке входа к нулю (внешние резисторы) или к единице (внутренние) напряжения на входе могут отличаться (т.е. при подтяжке к 1 - там 0, к 0 - там 1 и т.д.). При незасвеченной аналогично. Чтоб однозначно сказать схема датчика нужна. Но входы надо подтягивать однозначно...

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...