Например TDA7294

Форум РадиоКот • Просмотр темы - Гироскоп + pic18f45k22
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Пн май 19, 2025 22:17:20

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 25 ]  1,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Гироскоп + pic18f45k22
СообщениеДобавлено: Чт фев 05, 2015 12:33:56 
Грызет канифоль

Карма: 3
Рейтинг сообщений: 11
Зарегистрирован: Вт янв 01, 2013 15:42:37
Сообщений: 265
Рейтинг сообщения: 0
День добрый. Мне просто необходима Ваша помощь товарищи. Собираю так сказать "систему стабилизации плоскости". Идея простая - есть плоскость закрепленная на 3ех линейных приводах. На плоскости установлен датчик сообщающий МК текущее положение в пространстве. Если плоскость отклонена от горизонтального состояния - приводы стараются выставить её "в горизонт".
Ах да - это ж мой диплом.
Так вот с дуру подписался на данную тему (в принципе задачка фигня, т.к. руки не из попы и с МК чуть чуть дружу).
За 3 с небольшим дня сделал всю (почти всю) "механо-электрическую часть" и занялся программированием - и тут то оказался подвох.
Пример кода, который шел с гироскопом отказывается работать (или я идиот и не правильно что то делаю).
В добавок в коде куча не понятных мне команд + подключена библиотека в которой куча разных адресов (видимо необходимые для работы гироскопа, но откуда взятые непонятно).

Так вот -
1. Имеющиеся девайсы -Отладочная плата EasyPICv7 с МК pic18f45k22 на борту. ( http://www.mikroe.com/easypic/)
Гироскоп L3GD20 (Подробная инфа с примерами кода - http://www.mikroe.com/click/gyro/)
2. ПО - mikroC PRO for PIC.

Задача -
1. Разобраться в коде прилагаемом к гироскопу до такой степени, чтобы суметь написать его самостоятельно. Тут без Вас товарищи никак (2 дня ковыряюсь с инфой но результата не густо).
2. В идеале - запустить код из комплекта гироскопа.
3. Если нет, то - Подключить Гироскоп через I2C к МК и тупо через UART отправить инфу с него на комп.



На данный момент после прошивки имеющимся кодом МК ведет себя следующим образом - отказывается реагировать на кнопку RESET, в UARTе полнейшая тишина.
Если прошить простой программкой типа : UART1_Write_Text ("Hello"); Инфа успешно доходит до ПК и отображается на компе, что свидетельствует о функциональности соединения.

В коде непонятно следующее:



#include"L3GD20_Driver.h"
#define TSHLD 50

sbit GYRO_CS at LATE0_bit; // Chip Select pin ------Все строки с оператором sbit (особенно первая)
sbit GYRO_CS_Dir at TRISE0_bit;

sbit DATA_RDY at PORTE.B1; // DataReady - DRDY/INT2 pin
sbit DATA_RDY_Dir at TRISE1_bit;

sbit GYRO_INT at PORTB.B0; // Interrupt - INT1 pin
sbit GYRO_INT_Dir at TRISB0_bit;

GData value; ----- непонял.
long int r0_x, r0_y, r0_z; ------объявление переменных
float sumX, sumY, sumZ; ------объявление переменных
char response; ------объявление переменных

void MCU_Init(){ ---------- настройка МК
CM1CON = 0; // Turn off comparators ----Офаем компараторы
CM2CON = 0;
ANSELB = 0; // Configure pins as digital ------ Порты АБЦДЕ устанавливаем как цифровые
ANSELC = 0;
ANSELD = 0;
ANSELE = 0;
SLRCON = 0; ----------.

LATA = 0x00; // Reset LAT register values -----Сбрасываем все выводы портов АБЦДЕ в ноль
LATB = 0x00; ----------(не понял почему это делается командой LAT, если не ошибаюсь в версии PRO это делается командой PORT)
LATC = 0x00;
LATD = 0x00;
LATE = 0x00;

TRISA = 0x00; // Configure pins as output --выподы портов ABCDE выставляем на выход
TRISC = 0x00;
TRISC = 0x00;
TRISD = 0x00;
TRISE = 0x00;

UART1_Init(115200); // Initialize UART -----Включаем юарт на скорости 115200 бод
Delay_ms(100); // Wait for UART module to stabilize Ждем 100мс
I2C1_Init(100000); // Initialize I2C --Включаем I2C (С I2C никогда в жизни не работал)
}

void UART_Write_New_Line(){
UART1_Write_Text("\r\n"); -------Если верно понял, то выполнив предыдущий код должен выкинуть в UART сообщение "\r\n" (непонимаю что оно означает)
}

void Gyro_Config(){
unsigned short response; ---------- перменных типа unsigned shor
unsigned short i;
unsigned short ID;
char txt[3]; ---------- txt ????

r0_x = 0; ---------- значения
r0_y = 0; ---------Присваиваем значения
r0_z = 0;---------Присваиваем значения
response = 0;---------Присваиваем значения

response += L3GD20_Configure(L3GD20_CTRL_REG1, 0x1F); // Turn ON module (normal mode), enable X, Y and Z axis , ODR=95Hz, Cut-Off=25 --настройка гироскопа
response += L3GD20_Configure(L3GD20_CTRL_REG4, 0x00); // Full scale selection - 250dps --настройка гироскопа
response += L3GD20_Configure(L3GD20_CTRL_REG3, 0x08); // Enable Date-ready on DRDY/INT2 pin --настройка гироскопа
if (response == 3){ // Sum of all resposne values should be 3 ---в результате удачной настройки, переменной response присваивается 1. В иотоге response должна быть равна 3. Если это так то выполняется условие.
UART1_Write_Text("Gyro module initialized."); --Выводим в UArt "Gyro module initialized."
UART1_Write_Text("\r\n"); --Выводим в UArt "\r\n"
}
else{ ------иначе
UART1_Write_Text("Error: Gyro Config!"); --Выводим в UArt "Error: Gyro Config!"
UART1_Write_Text("\r\n"); --Выводим в UArt "\r\n"
}

ID = Identify_Gyro(); // Get ID from Gyroscope module ----ТУТ видимо считывается ID гироскопа
ByteToHex(ID, txt); // Convert byte value to HEX-String ----Преобразовывается из типа Byte в тип HEX и записывается в txt
UART1_Write_Text("GyroID: "); // ----выводится в UART надпись "GyroID: "
UART1_Write_Text(txt); // ----выводится в UART значение переменной txt
UART_Write_New_Line(); // ----переход на новую строку???
UART1_Write_Text("Calibration: Module should be in rest position."); --------выводится в UART надпись "Calibration: Module should be in rest position."
UART_Write_New_Line(); ----переход на новую строку???
for (i = 0 ; i < 64 ; i++ ){ // Collect 64 values in rest position ----Цикл от 0 до 63. Зачем хрен понять.
L3GD20_GetAngRateRaw(&value); ----непонятно
r0_x += value.X_AXIS; // Sum the values -- тут видимо к текущему значению прибовляется полученной значение с гироскопа.
r0_y += value.Y_AXIS; // for every
r0_z += value.Z_AXIS; // axis
}
r0_x >>= 6; // Find avreage reding in resting position ---непонятно
r0_y >>= 6; // and use them as correction values ---непонятно
r0_z >>= 6; // for all three axis ---непонятно
UART1_Write_Text("Calibration: Done!");
UART_Write_New_Line();
}

void DisplayAngleRate(char *str, float val){ ---непонятно
char txt[20];
UART1_Write_Text("| ");
UART1_Write_Text(str);
UART1_Write_Text(": ");
sprintf(txt, "%7.2f", val);
UART1_Write_Text(txt);
UART1_Write_Text(" deg |");
}

void NewLine(){
UART1_Write_Text("\r\n"); ---непонятно
}

void main() {
int Xval, Yval, Zval; - объявляем переменные
char display_flag = 0; - объявляем переменную и присваиваем ей ноль ??????

MCU_Init(); ---непонятно
Gyro_Init();---непонятно
Gyro_Config();---непонятно

NewLine(); ---непонятно
NewLine();---непонятно

sumX = 0;
sumY = 0;
sumZ = 0;
display_flag = 0; ---непонятно (он ведь и так ноль??)

while(1){
response = L3GD20_GetAngRateRaw(&value); // Colect new set of values -------Всё что ниже видимо тупо математика связанная с конкретными хар-ками гироскопа
if (response == 1){
if (abs(value.X_AXIS - r0_x) > TSHLD){ // If corrected value of X axis is over treshold level use the vale for integration
Xval = value.X_AXIS - r0_x; // Calculate Angular rate for X axis
sumX += Xval * 0.00875 / 94.8 * 3.0; // Multuply with dps factor for 250dps i's 8.75 mdps/sec (0,00875)
// frequecy of readig values from module ~95Hz(94.8) - three chanel (3.0)
display_flag = 1; // Raise the flag for data to be displayed via UART
}
if (abs(value.Y_AXIS - r0_y) > TSHLD){ // If corrected value of Y axis is over treshold level use the vale for integration
Yval = value.Y_AXIS - r0_y; // Calculate Angular rate for Y axis
sumY += Yval * 0.00875 / 94.8 * 3.0; // Multuply with dps factor for 250dps i's 8.75 mdps/sec (0,00875)
// frequecy of readig values from module ~95Hz(94.8) - three chanel (3.0)
display_flag = 1; // Raise the flag for data to be displayed via UART
}
if (abs(value.Z_AXIS - r0_z) > TSHLD){ // If corrected value of Z axis is over treshold level use the vale for integration
Zval = value.Z_AXIS - r0_z; // Calculate Angular rate for Z axis
sumZ += Zval * 0.00875 / 94.8 * 3.0; // Multuply with dps factor for 250dps i's 8.75 mdps/sec (0,00875)
// frequecy of readig values from module ~95Hz(94.8) - three chanel (3.0)
display_flag = 1; // Raise the flag for data to be displayed via UART
}
if(display_flag){ // If change was detected, send data via UART
DisplayAngleRate("sX", sumX); ---непонятно
DisplayAngleRate("sY", sumY); ---непонятно
DisplayAngleRate("sZ", sumZ); ---непонятно
NewLine();
display_flag = 0; // Reset flag variable
}
}
else
{
UART1_Write_Text("Error reading data!");
}
}
}




вот так выглядит это чудо на данный момент - Изображение




P.S. Всем заранее спасибо.

_________________
Не ошибается лишь тот - кто ничего не делает.


Последний раз редактировалось xxmafxx Чт фев 05, 2015 17:08:20, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Гироскоп + pic18f45k22
СообщениеДобавлено: Чт фев 05, 2015 15:52:44 
Грызет канифоль

Карма: 3
Рейтинг сообщений: 11
Зарегистрирован: Вт янв 01, 2013 15:42:37
Сообщений: 265
Рейтинг сообщения: 0
Кстати пока разбирался в коде заметил грубую ошибку -
TRISA = 0x00; // Configure pins as output
TRISC = 0x00;
TRISC = 0x00;

TRISD = 0x00;
TRISE = 0x00;

Появилась еще куча вопросов, но пока отлажу, а то может никто и на эти не ответит :)))

_________________
Не ошибается лишь тот - кто ничего не делает.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Гироскоп + pic18f45k22
СообщениеДобавлено: Чт фев 05, 2015 16:47:35 
Друг Кота
Аватар пользователя

Карма: 30
Рейтинг сообщений: 156
Зарегистрирован: Пн июл 28, 2008 22:12:01
Сообщений: 3604
Рейтинг сообщения: 0
xxmafxx писал(а):
Кстати пока разбирался в коде заметил грубую ошибку -


И что же в ней такого грубого ? :)))

Рекомендации на исходник читаем?
Цитата:
NOTES:
- Place Gyro click board in the mikroBUS socket 1.
- Turn ON UART communication SW1.1 and SW2.2
- Set jumpers J3 and J4 to RS-232 or USB based on desired port.


Половина ответов находится в мануале на MikroC , оставшаяся в мануале на С.
Ищется все минут за 5...

Кстати по фотке не видно, плата с гироскопом подключена в сокет основной или тем длиннющим шлейфом? :)))


Последний раз редактировалось dosikus Чт фев 05, 2015 17:07:04, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Гироскоп + pic18f45k22
СообщениеДобавлено: Чт фев 05, 2015 16:56:45 
Грызет канифоль

Карма: 3
Рейтинг сообщений: 11
Зарегистрирован: Вт янв 01, 2013 15:42:37
Сообщений: 265
Рейтинг сообщения: 0
Все рекомендации конечно соблюдены. Вы не видите ничего грубого? Если я не ошибаюсь модуль MSSP использует в данном случае именно порт B. Если его не выставить на выход, то и связи по I2C теоретически быть не должно.
Кто бы рассказал что вот это за значения -
#define L3GD20_WHO_AM_I 0x0F
#define L3GD20_CTRL_REG1 0x20
#define L3GD20_CTRL_REG2 0x21
#define L3GD20_CTRL_REG3 0x22
#define L3GD20_CTRL_REG4 0x23
#define L3GD20_CTRL_REG5 0x24
#define L3GD20_OUT_TEMP 0x26
#define L3GD20_STATUS_REG 0x27
#define L3GD20_OUT_X_L 0x28
#define L3GD20_OUT_X_H 0x29
#define L3GD20_OUT_Y_L 0x2A
#define L3GD20_OUT_Y_H 0x2B
#define L3GD20_OUT_Z_L 0x2C
#define L3GD20_OUT_Z_H 0x2D
#define L3GD20_FIFO_CTRL_REG 0x2E

#define L3GD20_W_ADDRESS 0xD6
#define L3GD20_R_ADDRESS 0xD7

Гироскоп воткнут в плату (на фото его просто еще нет)

Кстати опять же - Turn ON UART communication SW1.1 and SW2.2 Полная чушь - переключатель SW2.1 должен быть включен а не 2.2. (выяснил куря даташит на МК ибо 2.2 это вообще нога порта С не имеющая отношения к UART.) Пока не устранил данную ошибку UART запустить не удавалось.

Кстати по ходу понимания определенных строк буду корректировать первый пост.

_________________
Не ошибается лишь тот - кто ничего не делает.


Вернуться наверх
 
Открыт интернет-магазин MEAN WELL.Market – весь ассортимент MEAN WELL, выгодные цены

Открыта удобная площадка с выгодными ценами, поставляющая весь ассортимент продукции, производимой компанией MEAN WELL – от завоевавших популярность и известных на рынке изделий до новинок. MEAN WELL.Market предоставляет гарантийную и сервисную поддержку, удобный подбор продукции, оперативную доставку по России. На сайте интернет-магазина посетители смогут найти обзоры, интересные статьи о применении, максимальный объем технических сведений.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Гироскоп + pic18f45k22
СообщениеДобавлено: Чт фев 05, 2015 17:35:18 
Друг Кота
Аватар пользователя

Карма: 30
Рейтинг сообщений: 156
Зарегистрирован: Пн июл 28, 2008 22:12:01
Сообщений: 3604
Рейтинг сообщения: 0
Давайте отлаживать . :)))
Если вы так уперто уверены что UART подключен верно, в терминале стоит верная скорость 115200.

В функции MCU_Init после
Код:
UART1_Init(115200); // Initialize UART -----Включаем юарт на скорости 115200 бод
Delay_ms(100); // Wait for UART module to stabilize Ждем 100мс

Вставьте строки
Код:
UART1_Write_Text("Uart init ok.");
    UART1_Write_Text("\r\n");


Скомпилируйте и запустите ...


Вернуться наверх
 
LED-драйверы MOSO - надежные решения для индустриальных приложений

Продукция MOSO предназначена в основном для индустриальных приложений, использует инновационные решения на основе более 200 собственных патентов для силовой электроники и соответствует международным стандартам. LED-драйверы MOSO применяются в системах наружного освещения разных отраслей, включая промышленность, сельское хозяйство, транспорт и железную дорогу. В ряде серий реализована возможность дистанционного контроля и программирования работы по заданному сценарию. Разберем решения MOSO подробнее>>
Не в сети
 Заголовок сообщения: Re: Гироскоп + pic18f45k22
СообщениеДобавлено: Чт фев 05, 2015 17:47:42 
Грызет канифоль

Карма: 3
Рейтинг сообщений: 11
Зарегистрирован: Вт янв 01, 2013 15:42:37
Сообщений: 265
Рейтинг сообщения: 0
Завтра бум пробовать:) Всю эту байду я домой не потащил (живу за 25км от института). Нашел библиотеку L3G под ардуино. Там те же значения (#define L3G_CTRL_REG1 0x20,
#define L3G_CTRL_REG2 0x21, #define L3G_CTRL_REG3 0x22......) и у людей работает, видимо в них ошибки нет.
Кстати еще такой вопрос - почему МК может переставать отзываться на кнопку RESET? Зависание программы может вызвать подобное?

Нарыл документацию на гироскоп - https://www.pololu.com/file/download/L3 ... e_id=0J563
Как оказалось тут всё указано (за что и какая цифра отвечает).

_________________
Не ошибается лишь тот - кто ничего не делает.


Последний раз редактировалось xxmafxx Чт фев 05, 2015 18:05:01, всего редактировалось 1 раз.

Вернуться наверх
 
Распродажа паяльного оборудования ATTEN!
Паяльные станции, паяльники и аксессуары по самой выгодной цене.

По промокоду radiokot скидка 10%
Не в сети
 Заголовок сообщения: Re: Гироскоп + pic18f45k22
СообщениеДобавлено: Чт фев 05, 2015 17:58:59 
Друг Кота
Аватар пользователя

Карма: 30
Рейтинг сообщений: 156
Зарегистрирован: Пн июл 28, 2008 22:12:01
Сообщений: 3604
Рейтинг сообщения: 0
А с чего вы уверены что он не реагирует?
У вас же в UART выхлопа нет, чем смотрите ? :)))


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Гироскоп + pic18f45k22
СообщениеДобавлено: Чт фев 05, 2015 18:08:47 
Грызет канифоль

Карма: 3
Рейтинг сообщений: 11
Зарегистрирован: Вт янв 01, 2013 15:42:37
Сообщений: 265
Рейтинг сообщения: 0
Там ведь на всех портах висят светодиоды (часть из них естественно светится). Обычно при нажатии на Reset светики гаснут и снова загораются. Но после заливки данной проги на нажатие Reset реакции нет.

_________________
Не ошибается лишь тот - кто ничего не делает.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Гироскоп + pic18f45k22
СообщениеДобавлено: Чт фев 05, 2015 18:26:43 
Друг Кота
Аватар пользователя

Карма: 30
Рейтинг сообщений: 156
Зарегистрирован: Пн июл 28, 2008 22:12:01
Сообщений: 3604
Рейтинг сообщения: 0
Мда , то есть Led'ы живут своей жизнью? :)))
Во первых при ините все порты переводятся в 0 , а сие гасит все "светики".
Во вторых висящие на I2C шине ваши "светики" могут стать причиной завала шины ... :)))

А так спасибо, поржал от души... :)))


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Гироскоп + pic18f45k22
СообщениеДобавлено: Чт фев 05, 2015 18:30:55 
Грызет канифоль

Карма: 3
Рейтинг сообщений: 11
Зарегистрирован: Вт янв 01, 2013 15:42:37
Сообщений: 265
Рейтинг сообщения: 0
Ну насчет светиков на шине спасибо - учту (хотя UARTу явно пофиг, а вот I2C как себя поведет хз). А вот почему остальные светодиоды загораются, при чем не все, и только в определенном порядке, после прошивки без понятия. Хотя сам понимаю что в начале проги все порты зануляются. Есть еще вариант что команду LAT версия PRO всетаки не жует. Попробую переписать на PORT.

_________________
Не ошибается лишь тот - кто ничего не делает.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Гироскоп + pic18f45k22
СообщениеДобавлено: Чт фев 05, 2015 18:39:52 
Друг Кота
Аватар пользователя

Карма: 30
Рейтинг сообщений: 156
Зарегистрирован: Пн июл 28, 2008 22:12:01
Сообщений: 3604
Рейтинг сообщения: 0
xxmafxx писал(а):
Есть еще вариант что команду LAT версия PRO всетаки не жует. Попробую переписать на PORT.


А причем здесь LAT и версия IDE ? В 18ых и нужно использовать LAT во избежание ЧМЗ...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Гироскоп + pic18f45k22
СообщениеДобавлено: Чт фев 05, 2015 18:46:41 
Грызет канифоль

Карма: 3
Рейтинг сообщений: 11
Зарегистрирован: Вт янв 01, 2013 15:42:37
Сообщений: 265
Рейтинг сообщения: 0
Заметил данную проблему когда использовал примеры от EasyPIc5 у него на борту 16f877a, но дело даже не в этом. К пятому шло ПО MicroC for PIC. А с седьмой версией уже MicroC PRO for PIC. И зачем то они изменили синтаксис. В результате приходилось для использования примеров тупо переписывать код.

_________________
Не ошибается лишь тот - кто ничего не делает.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Гироскоп + pic18f45k22
СообщениеДобавлено: Чт фев 05, 2015 19:01:18 
Друг Кота
Аватар пользователя

Карма: 30
Рейтинг сообщений: 156
Зарегистрирован: Пн июл 28, 2008 22:12:01
Сообщений: 3604
Рейтинг сообщения: 0
xxmafxx писал(а):
И зачем то они изменили синтаксис.


Внимательней читайте - LAT введен в 18ых пЫках . Дальше объяснять? :)))


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Гироскоп + pic18f45k22
СообщениеДобавлено: Чт фев 05, 2015 19:04:11 
Грызет канифоль

Карма: 3
Рейтинг сообщений: 11
Зарегистрирован: Вт янв 01, 2013 15:42:37
Сообщений: 265
Рейтинг сообщения: 0
Странно. Действительно так. Ладно этот пункт можно опускать. В чем же тогда может быть причина такой хаотичности в портах?

_________________
Не ошибается лишь тот - кто ничего не делает.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Гироскоп + pic18f45k22
СообщениеДобавлено: Пт фев 06, 2015 11:38:46 
Грызет канифоль

Карма: 3
Рейтинг сообщений: 11
Зарегистрирован: Вт янв 01, 2013 15:42:37
Сообщений: 265
Рейтинг сообщения: 0
Сегодня сделал следующие -
1. Поотключал всю перефирию на плате (светодиоды, динамик, LCD и пр.)
2. ПОследовательно начал заливать "урезанный код" начиная с функции MCU_Init.
В результате получилось следующее -
#include"L3GD20_Driver.h"
#define TSHLD 50

sbit GYRO_CS at LATE0_bit; // Chip Select pin
sbit GYRO_CS_Dir at TRISE0_bit;

sbit DATA_RDY at PORTE.B1; // DataReady - DRDY/INT2 pin
sbit DATA_RDY_Dir at TRISE1_bit;

sbit GYRO_INT at PORTB.B0; // Interrupt - INT1 pin
sbit GYRO_INT_Dir at TRISB0_bit;

GData value;
long int r0_x, r0_y, r0_z;
float sumX, sumY, sumZ;
char response;

void MCU_Init(){
CM1CON = 0; // Turn off comparators
CM2CON = 0;
ANSELB = 0; // Configure pins as digital
ANSELC = 0;
ANSELD = 0;
ANSELE = 0;
SLRCON = 0;

LATA = 0x00; // Reset LAT register values
LATB = 0x00;
LATC = 0x00;
LATD = 0x00;
LATE = 0x00;

TRISA = 0x00; // Configure pins as output
TRISB = 0x00;
TRISC = 0x00;
TRISD = 0x00;
TRISE = 0x00;

UART1_Init(9600); // Initialize UART
Delay_ms(100); // Wait for UART module to stabilize
I2C1_Init(100000); // Initialize I2C
}

void UART_Write_New_Line(){
UART1_Write_Text("\r\n");
}

void Gyro_Config(){
unsigned short response;
unsigned short i;
unsigned short ID;
char txt[3];

r0_x = 0;
r0_y = 0;
r0_z = 0;
response = 0;

response += L3GD20_Configure(L3GD20_CTRL_REG1, 0x1F); // Turn ON module (normal mode), enable X, Y and Z axis , ODR=95Hz, Cut-Off=25
response += L3GD20_Configure(L3GD20_CTRL_REG4, 0x00); // Full scale selection - 250dps
response += L3GD20_Configure(L3GD20_CTRL_REG3, 0x08); // Enable Date-ready on DRDY/INT2 pin
if (response == 3){ // Sum of all resposne values should be 3
UART1_Write_Text("Gyro module initialized.");
UART1_Write_Text("\r\n");
}
else{
UART1_Write_Text("Error: Gyro Config!");
UART1_Write_Text("\r\n");
}

ID = Identify_Gyro(); // Get ID from Gyroscope module
ByteToHex(ID, txt); // Convert byte value to HEX-String
UART1_Write_Text("GyroID: "); //
UART1_Write_Text(txt); //
UART_Write_New_Line(); //
UART1_Write_Text("Calibration: Module should be in rest position.");
UART_Write_New_Line();
for (i = 0 ; i < 64 ; i++ ){ // Collect 64 values in rest position
L3GD20_GetAngRateRaw(&value);
r0_x += value.X_AXIS; // Sum the values
r0_y += value.Y_AXIS; // for every
r0_z += value.Z_AXIS; // axis
}
r0_x >>= 6; // Find avreage reding in resting position
r0_y >>= 6; // and use them as correction values
r0_z >>= 6; // for all three axis
UART1_Write_Text("Calibration: Done!");
UART_Write_New_Line();
}

void DisplayAngleRate(char *str, float val){
char txt[20];
UART1_Write_Text("| ");
UART1_Write_Text(str);
UART1_Write_Text(": ");
sprintf(txt, "%7.2f", val);
UART1_Write_Text(txt);
UART1_Write_Text(" deg |");
}

void NewLine(){
UART1_Write_Text("\r\n");
}

void main() {
int Xval, Yval, Zval;
char display_flag = 0;

MCU_Init();
Gyro_Init();
Gyro_Config();

NewLine();
NewLine();

sumX = 0;
sumY = 0;
sumZ = 0;
display_flag = 0;


}


Вот в таком виде все это дело функционирует - инициализируются порты и производится калибровка гироскопа. В UART выводится следующее - Изображение

Если же последний кусок кода не вырезать то в UART ВОобще ничего не выводится!!!
Вот так платка выглядит с гироскопом - Изображение

_________________
Не ошибается лишь тот - кто ничего не делает.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Гироскоп + pic18f45k22
СообщениеДобавлено: Пт фев 06, 2015 12:27:50 
Друг Кота
Аватар пользователя

Карма: 30
Рейтинг сообщений: 156
Зарегистрирован: Пн июл 28, 2008 22:12:01
Сообщений: 3604
Рейтинг сообщения: 0
Э так не пойдет, что конкретно вырезал ? Здесь вставь эти строки вставь.
И не вырезай в коде а закомментируй . Надо точно знать - на какой строке затык ....


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Гироскоп + pic18f45k22
СообщениеДобавлено: Пт фев 06, 2015 12:55:13 
Грызет канифоль

Карма: 3
Рейтинг сообщений: 11
Зарегистрирован: Вт янв 01, 2013 15:42:37
Сообщений: 265
Рейтинг сообщения: 0
while(1){
response = L3GD20_GetAngRateRaw(&value); // Colect new set of values -------Всё что ниже видимо тупо математика связанная с конкретными хар-ками гироскопа
if (response == 1){
if (abs(value.X_AXIS - r0_x) > TSHLD){ // If corrected value of X axis is over treshold level use the vale for integration
Xval = value.X_AXIS - r0_x; // Calculate Angular rate for X axis
sumX += Xval * 0.00875 / 94.8 * 3.0; // Multuply with dps factor for 250dps i's 8.75 mdps/sec (0,00875)
// frequecy of readig values from module ~95Hz(94.8) - three chanel (3.0)
display_flag = 1; // Raise the flag for data to be displayed via UART
}
if (abs(value.Y_AXIS - r0_y) > TSHLD){ // If corrected value of Y axis is over treshold level use the vale for integration
Yval = value.Y_AXIS - r0_y; // Calculate Angular rate for Y axis
sumY += Yval * 0.00875 / 94.8 * 3.0; // Multuply with dps factor for 250dps i's 8.75 mdps/sec (0,00875)
// frequecy of readig values from module ~95Hz(94.8) - three chanel (3.0)
display_flag = 1; // Raise the flag for data to be displayed via UART
}
if (abs(value.Z_AXIS - r0_z) > TSHLD){ // If corrected value of Z axis is over treshold level use the vale for integration
Zval = value.Z_AXIS - r0_z; // Calculate Angular rate for Z axis
sumZ += Zval * 0.00875 / 94.8 * 3.0; // Multuply with dps factor for 250dps i's 8.75 mdps/sec (0,00875)
// frequecy of readig values from module ~95Hz(94.8) - three chanel (3.0)
display_flag = 1; // Raise the flag for data to be displayed via UART
}
if(display_flag){ // If change was detected, send data via UART
DisplayAngleRate("sX", sumX); ---непонятно
DisplayAngleRate("sY", sumY); ---непонятно
DisplayAngleRate("sZ", sumZ); ---непонятно
NewLine();
display_flag = 0; // Reset flag variable
}
}
else
{
UART1_Write_Text("Error reading data!");
}
}
}


Без вот этого дела работает ( ну как работает, на скрине видно все что долетает до UARTа)


while(1){
response = L3GD20_GetAngRateRaw(&value); // Colect new set of values -------Всё что ниже видимо тупо математика связанная с конкретными хар-ками гироскопа
if (response == 1){
UART1_Write_Text("Error reading data!");
}
В таком виде тож работает (то есть в переменную response записывается единичка)

_________________
Не ошибается лишь тот - кто ничего не делает.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Гироскоп + pic18f45k22
СообщениеДобавлено: Пт фев 06, 2015 13:29:16 
Друг Кота
Аватар пользователя

Карма: 30
Рейтинг сообщений: 156
Зарегистрирован: Пн июл 28, 2008 22:12:01
Сообщений: 3604
Рейтинг сообщения: 0
Цитата:
на скрине видно все что долетает до UARTа


Веришь , нет. Ничего там не видно . :)))

Если в response получаем 1 то это затык ,
.
Упс , это ты так поправил. :)))

Гы ... там дисплей фигурирует, он часом не 16х2 с проверкой флагов .
Дисплей у тебя подключен????????


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Гироскоп + pic18f45k22
СообщениеДобавлено: Пт фев 06, 2015 14:38:16 
Грызет канифоль

Карма: 3
Рейтинг сообщений: 11
Зарегистрирован: Вт янв 01, 2013 15:42:37
Сообщений: 265
Рейтинг сообщения: 0
Нет там дисплей вообще не учавствует. Если вы про оператор DisplayAngleRate то это всего лишь функция void DisplayAngleRate(char *str, float val). Она каким-то хитрым образом видимо массив выводит в UART. Подозреваю что ошибка либо в ней либо в библиотеке где то в этом куске -
unsigned short L3GD20_GetAngRateRaw(GData *buff){
char low_byte;
char high_byte;

while(!DATA_RDY){};
if( !L3GD20_ReadReg(L3GD20_OUT_X_L, &low_byte) ) // Read the LBs from X axis output register
return 0;
if( !L3GD20_ReadReg(L3GD20_OUT_X_H, &high_byte) ) // Read the LBs from X axis output register
return 0;
buff->X_AXIS = ( (high_byte << 8) | low_byte ); // Create int from two bytes
while(!DATA_RDY){};
if( !L3GD20_ReadReg(L3GD20_OUT_Y_L, &low_byte) ) // Read the LBs from Y axis output register
return 0;
if( !L3GD20_ReadReg(L3GD20_OUT_Y_H, &high_byte) ) // Read the LBs from Y axis output register
return 0;
buff->Y_AXIS = ( (high_byte << 8) | low_byte ); // Create int from two bytes
while(!DATA_RDY){};
if( !L3GD20_ReadReg(L3GD20_OUT_Z_L, &low_byte) ) // Read the LBs from Z axis output register
return 0;
if( !L3GD20_ReadReg(L3GD20_OUT_Z_H, &high_byte) ) // Read the LBs from Z axis output register
return 0;
buff->Z_AXIS = ( (high_byte << 8) | low_byte ); // Create int from two bytes

return 1;
}




Gyro module initialized.
GyroID:22
Calibration: Module should be in rest position.
Calibration: Done!


Это то что вылазиит в UArte без последней части кода.

_________________
Не ошибается лишь тот - кто ничего не делает.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Гироскоп + pic18f45k22
СообщениеДобавлено: Пт фев 06, 2015 15:23:00 
Друг Кота
Аватар пользователя

Карма: 30
Рейтинг сообщений: 156
Зарегистрирован: Пн июл 28, 2008 22:12:01
Сообщений: 3604
Рейтинг сообщения: 0
Вставь после response = L3GD20_GetAngRateRaw(&value);

Код:
DisplayAngleRate("Test", 0.89);
UART1_Write_Text("Test2");


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 25 ]  1,  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y