Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: ivan_fd  
Помогите оптимизировать код
nekill Дата: Пн, 08.08.2011, 08:34  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Новенький
Сообщений: 2
Репутация: 0   ±
Замечания:   ±
На сайте с 05.08.2011

Статус: Offline

Всех приветствую. Сделал электронный барометр на датчике MPX4115A, работает, но в связи с тем, что выходная характеристика датчика линейная но имеет небольшой наклон, зависимость выходного сигнала от давления выглядит следующим образом
Vout=Vs*(.0009*P-0.0095) , где Р давление в кПа
Из этой формулы выразим значение давления
P=((Vout/Vs)+0.095)/0.0009, для давления в кПа
P=((Vout/Vs)+0.095)/0.0012, для давления в мм ртутного столба
В программе для получения значения давления использовал формулу в след виде
P=((volt+1)/256)+0.095)/0.0012, где volt-значение АЦП, но так как PicBasic с дробными числами не работает, я ничего другого придумать не смог как разложить числа на целые и дробные части и считать их отдельно, причем когда в расчете дробной части получается целое число, его приходится переносить в целую часть числа и считать далее. В итоге все работает, но код программы мне не нравится можно ли его оптимизировать. Подскажите как.

' ---------------------[Подключаемые файлы и настройка режимов]---------------------------

' Задание параметров для команды ADCIN PIC16F876
Define ADC_BITS 8 ' Задать число разрядов в результате
Define ADC_CLOCK 3 ' Выбрать источник тактового сигнала (3 = RC)
Define ADC_SAMPLEUS 50 ' Задать время преобразования в микросекундах

' ---------------------[Переменные]-------------------------------------------------------
'
adval var byte ' Создать переменную для хранения результата
advam var word
volt var byte
indic var word
decimal var word
rez1 var word
rez2 var word
rez3 var word
delen1 var word
delen2 var word
delen3 var word
delen4 var word
'
' ---------------------[Процедура инициализации]------------------------------------------
Init:
PortB = $00 ' Все выходы перед началом сбросить в 0
TrisB = %00000000 ' Все выводы порта PORTB сделать выходами

' ---------------------[Основная программа]-----------------------------------------------

TRISA = %11111111 ' Сделать все выводы порта PORTA входами
ADCON1 =%00000010 ' Сделать выводы порта PORTA аналоговыми входами

Define LOADER_USED 1 ' Эта строка нужна только если для прошивки

DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 3
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 0
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2

DEFINE LCD_COMMANDUS 2000 ' Задать паузу между передачей команд на ЖКИ
DEFINE LCD_DATAUS 50 ' Задать паузу между передачей данных на ЖКИ

start:
ADCIN 2, volt ' Преобразовать напряжение в канале 2

rez1=((volt+1)*100)/256
delen1=((volt+1)*100)//256
delen2=(delen1*10)/1000
rez2=((rez1*10)+delen2+95)*10
delen3=(delen1//1000)*10
delen4=delen3/1000
indic=(rez2+delen4)/12 ' целая часть значения давления для вывода на дисплей
decimal=(rez2+delen4)//12 ' десятичная часть значения давления для вывода на дисплей


lcdout $fe,1, dec volt," P=", dec (indic),",", dec1 (decimal)
pause 1000

goto start

Сообщение отредактировал nekill - Пн, 08.08.2011, 08:40
ЯНДЕКС Дата: 08.08.2011
MasterPic Дата: Сб, 13.08.2011, 11:44  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 186
Репутация: 2   ±
Замечания:   ±
На сайте с 22.11.2008

Статус: Offline

Используй переменные типа Float, если позволяет место.
ivan_fd Дата: Сб, 13.08.2011, 17:52  |                                                                                                                Сообщение # 3
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Quote (MasterPic)
Используй переменные типа Float, если позволяет место.


Quote (nekill)
но так как PicBasic с дробными числами не работает


Это PicBasicpro, у него нету типа Float. Разве, что использовать внешние модули.

Сообщение отредактировал ivan_fd - Сб, 13.08.2011, 17:53
deskjet Дата: Вс, 14.08.2011, 14:28  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 143
Репутация: 5   ±
Замечания:   ±
На сайте с 20.06.2009

Статус: Offline

Quote (nekill)
Помогите оптимизировать код

Это проще простого и не надо связываться с Float.
Нужно в операциях деления\умножения избавляться от дробных чисел. Для этого, в арифметических операциях, нужно использовать
числа умноженные например на 1000, и в конце вычислений разделить результат на ту же тысячу.


За 20 8 дней ни одного сгоревшего микроконтроллера.
PIC12, PIC16, PIC18, ATtiny, ATmega, STM8, STM32, MSP430
MasterPic Дата: Вс, 14.08.2011, 15:41  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 186
Репутация: 2   ±
Замечания:   ±
На сайте с 22.11.2008

Статус: Offline

Ну у него так и сделано, вообще-то. А в PBP можно подключить библиотеки для работы с Float
  • Страница 1 из 1
  • 1
Поиск: