вычисление математи...
 

вычисление математических функций  

  RSS

mas_nk
(@mas_nk)
Бывалый
Присоединился: 10 лет назад
Сообщения: 19
10/06/2009 11:56 дп  

помогите разобраться с вычислением тангенса в CodeVision

исходные данные
unsigned int a1,a2; \16 бит измерения АЦП

Для вычисления тангенса y/x в Codevision есть функция
float atan2(float y, float x)

подскажите с кодом, как мне описать фун-ию и вычислить тангенс?

мой вариант такой:
unsigned int a1,a2;
float temp;

float atan2(float a1, float a2);

void main(void)
{
while (1)
{ a1=read_adc(1);
a2=read_adc(2);
temp=atan2(float a1, float a2);

printf("temp=%d",temp); \Отправляем в USART
putchar(0x0D);
};
}


Цитата
Мужик
(@yk)
Старожил
Присоединился: 11 лет назад
Сообщения: 39
10/06/2009 4:32 пп  

Здравствуйте!
На какую строку ругается компилятор?
Выложите файл проекта в CodeVisionAVR - попытаюсь скомпилить.
Попробуйте заменить float atan2(float a1, float a2); на float atan2((float)a1, (float)a2);(обычно указываю в скобках).
Во вторых попробуйте писать printf("temp=%f",temp); \Отправляем в USART


ОтветитьЦитата
mas_nk
(@mas_nk)
Бывалый
Присоединился: 10 лет назад
Сообщения: 19
11/06/2009 10:42 дп  

Спасибо за ответ.
с компилятором разобрался сейчас компилирует
но считает что то непонятное выдает числа порядка 4095, 5632 и т.д.
я думаю что заморочка в следующем:
в меге16 (регистр ADCW) 10 разрядное ацп а переменные а1, а2 16 битные
как он их преобразует непойму?
как сделать что бы выводились на USART числа с плавающей точкой?
может перед вычислениями а1 и а2 перевести в двоичное число?


ОтветитьЦитата
Radioded
(@sergey)
Admin
Присоединился: 2 недели назад
Сообщения: 184
12/06/2009 1:29 дп  

Попробуйте задать определённые значения а1 и а2 и посмотрите правильно ли высчитывается арктангентс.
В функции printf() %f показывает, что тип float т.е. число с плавающей запятой.


ОтветитьЦитата
mas_nk
(@mas_nk)
Бывалый
Присоединился: 10 лет назад
Сообщения: 19
15/06/2009 1:55 пп  

Попытался разобраться с printf(), написал код для отладки
значению a3 присваиваю 5.2 и в USART отправляю в разных видах
#include <mega16.h>
#include <stdio.h>
#include <delay.h>

float a3=5.2;
void main(void)
{

PORTA=0x00;
DDRA=0x00;

PORTB=0x00;
DDRB=0x00;

PORTC=0x00;
DDRC=0x00;

PORTD=0x00;
DDRD=0x00;

TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

MCUCR=0x00;
MCUCSR=0x00;

TIMSK=0x00;

UCSRA=0x00;
UCSRB=0x18;
UCSRC="0x86;"
UBRRH=0x00;
UBRRL=0x19;

ACSR=0x80;
SFIOR=0x00;

while (1)
{
printf("a3=%i",a3);
putchar(0x0D);

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

printf("a3=%u",a3);
putchar(0x0D);

printf("a3=%e",a3);
putchar(0x0D);

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

printf("a3=%x",a3);
putchar(0x0D);
// Place your code here

delay_ms(3000);
};
}

на терминале выводится
a3=26214
a3=26214
a3=26214
a3=
a3=
a3=6666

если присвоить 4.1 на терминал выводится
a3=13107
a3=13107
a3=13107
a3=
a3=
a3=3333


ОтветитьЦитата
mas_nk
(@mas_nk)
Бывалый
Присоединился: 10 лет назад
Сообщения: 19
30/06/2009 8:34 дп  

Разобрался, в конфиге проекта нужно поставить свойства функции printf (float, width,precision)


ОтветитьЦитата

Пожалуйста, Вход или Зарегистрироваться