вычисление математи...
 
Уведомления
Очистить все

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

6 Посты
3 Пользователи
0 Likes
6,661 Просмотры
mas_nk
(@mas_nk)
Active Member
Присоединился: 15 лет назад
Сообщения: 19
Topic starter  

помогите разобраться с вычислением тангенса в 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)
Eminent Member
Присоединился: 15 лет назад
Сообщения: 39
 

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


ОтветитьЦитата
mas_nk
(@mas_nk)
Active Member
Присоединился: 15 лет назад
Сообщения: 19
Topic starter  

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


ОтветитьЦитата
Radioded
(@sergey)
Estimable Member Admin
Присоединился: 5 лет назад
Сообщения: 184
 

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


ОтветитьЦитата
mas_nk
(@mas_nk)
Active Member
Присоединился: 15 лет назад
Сообщения: 19
Topic starter  

Попытался разобраться с 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)
Active Member
Присоединился: 15 лет назад
Сообщения: 19
Topic starter  

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


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