Цифровой компас

Схемы и устройства на микроконтроллерах. Обсуждение.
mas_nk
Сообщения: 19
Зарегистрирован: 26 мар 2009, 15:18

Цифровой компас

Сообщение mas_nk » 24 июн 2009, 11:56

Пришли датчики, спаял схему по даташиту. Включил, ничего не работает, начал разбираться по элементам. С HMC1021, HMC1022 все стало понятно но в операционнике пришлось увеличить коэффицент умножения что бы повысить разрешающую способность.
Дальше очередь дошла до ADXL213, Rset установил 125кОм, на осцилографе сигнал меняет форму при наклонах датчика, а прога не считает правильно Т1 и Т2 вот код, подскажите в чем может быть проблема
#include <mega16.h>
#include <stdio.h>
#include <delay.h>
#include <stdlib.h>
#include <math.h>


#define Rising 1
#define Falling 0
double accel = 0;
unsigned int T1=0, T2=0, PreviousTime, CurrentTime;
unsigned char CurrentEdge;
float roll;

interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
if (CurrentEdge == Rising){

CurrentTime = ICR1L;
CurrentTime += (int)ICR1H<<8;
TCCR1B = 0b00000010; //ск/8


CurrentEdge = Falling;

if (CurrentTime>PreviousTime) T2 = CurrentTime-PreviousTime;
else T2 = 65535-PreviousTime+CurrentTime;
PreviousTime=CurrentTime;
} else { // if Edge Falling

CurrentTime = ICR1L;
CurrentTime += (int)ICR1H<<8;


TCCR1B = 0b01000010; // set Rising edge ск/8
CurrentEdge = Rising;

if (CurrentTime>PreviousTime) T1 = CurrentTime-PreviousTime;
else T1= 65535-PreviousTime+CurrentTime;
PreviousTime=CurrentTime;
}

printf("T1=%d",T1);
putchar(0x0D);
printf("T2=%d",T2);
putchar(0x0D);

accel = ((double)T1/((double)T1+(double)T2)-0.5)/0.3;

roll = asin(accel/9.81)*180/3.14; // пересчет ускорения в угол наклона и перевод из радиан в градусы

printf("accel=%f",accel);
putchar(0x0D);
printf("roll=%f",roll);
putchar(0x0D);

}

void main(void)
{
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;
ACSR=0x80;
SFIOR=0x00;

TIMSK |= (1<< TICIE1);
TCCR1A = 0;
TCCR1B=0b11000010;

TCNT1 = 0;
CurrentEdge = Rising;

#asm("sei")

while (1) ;

delay_ms(3000);
}
Частота кварца 4 мгц, Т1 выдает в горизонтальном положении 26589, Т2=26730
в повернутом на 90гр Т1= 25851 Т2=26120 хотя на осцилографе Т1 как минимум в три раза больше Т2

Lintux
Сообщения: 1
Зарегистрирован: 25 авг 2010, 13:11

Re: Цифровой компас

Сообщение Lintux » 25 авг 2010, 14:27

Доброго времени суток!
Просмотрел код представленный mas_nk И появился вопрос вот какого рода:
1. В расчете ускорения в размерности g
accel = ((double)T1/((double)T1+(double)T2)-0.5)/0.3; откуда берется коэффициент 0,3 ?
2. Вызывает интерес ещё место в исходном коде
TCCR1B = 0b01000010;
CurrentEdge = Rising;
получается, что фильтрация входного сигнала ICP будет отключена после первого же срабатывания прерывания и далее никогда не будет применяться. Или я ошибаюсь?

Ответить

Кто сейчас на конференции

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