Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
[WRG]
52 / 52 / 37
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
1

Нормирование данных датчика температуры LM35 с АЦП (ATMega48)

04.05.2014, 12:35. Просмотров 1357. Ответов 3
Метки нет (Все метки)

Есть следующий код, выводит значение, считанное с АЦП во вторую строку на экранчике побитово. Проблема в том, что АЦП не читает значение, все время на выходе 0x0. Если замкнуть PC0 на 5В, то будет 0xFF, промежуточных значений не принимает в принципе.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#define F_CPU 1000000UL
 
#include <avr/io.h>
#include <avr/delay.h>
#include <stdlib.h>
#include <avr/eeprom.h>
#include "lcd.h"
 
void delay(uint16_t ms);
void adc_init();
int16_t get_temperature();
 
int main() {
    // настройка порта
    DDRD = 0xFF;
    PORTD = 0x00;
    DDRC = 0x0;
 
    // настройка АЦП
    adc_init();
 
    // настройка дисплея
    lcd_init();
 
    int32_t counter = 0;
    char str[10];
    int16_t data;
 
    lcd_write_str(">   km/h");
    //lcd_write_data(0xA1+0x1);
 
    int8_t val = 1;
 
    while(1){
        lcd_set_cursor(0, 1);
        itoa(counter, str, 10);
        lcd_write_str(str);
        lcd_set_cursor(0, 11);
        lcd_write_str("100");
        lcd_write_data(0xDF);
        lcd_write_str("C");
 
        lcd_set_cursor(1, 0);
        data = get_temperature();
        //lcd_write_data((int)(0.001 * data));
        for(int i = 0; i < 10; i++){
            if(bit_is_set(data, i)){
                lcd_write_str("1");
            } else {
                lcd_write_str("0");
            }
        }
 
        if(counter > 35){
            val = -1;
        } else if (counter <= 20){
            val = 1;
        }
 
        counter += val;
 
        delay(1000);
    }
 
    return 0;
}
 
// my delay function
void delay(uint16_t ms)
{
    for(int i = 0; i < ms; i++)
        _delay_ms(1);
}
 
// this function inits ADC with internal reference voltage source
void adc_init()
{
    ADMUX = 0b11000000;
    ADCSRA = 0b10000011;
}
 
// gets temperature from LM35 sensor
int16_t get_temperature()
{
    ADMUX = 0 | (ADMUX & 0xF0);
    _delay_us(10);
    ADCSRA |= (1 << 6);
    loop_until_bit_is_clear(ADCSRA, ADSC);
    _delay_us(1);
    return ADCW;
}
В качестве источника опорного наприяжения АЦП выбран внутренний источник на 1.1В. Помогите пожалуйста, целый вечер мучаюсь! Читать пытаюсь с датчика температуры LM35, вольтметром меряю на выходе - все нормально, АЦП кажет 0x0

Добавлено через 12 часов 24 минуты
Проблема решена, забыл припаять AVCC к VCC. Теперь появилась другая проблема - деление результата чтения с АЦП на 9.31 занимает аж 1.5кб флеша. Негоже это.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.05.2014, 12:35
Ответы с готовыми решениями:

Прием и обработка данных с цифрового датчика температуры ADT7310
Доброго времени суток Помогите написать программу приема данных с датчика температуры ADT7310 на...

Proteus. Нарисовать схему снятия данных с датчика температуры и вывода на дисплей
Ребята, мне надо собрать микропроцессорную систему в Proteus, которая будет работать следующим...

Вопрос по точности АЦП в Atmega48
Делаю измеритель на микроконтроллере и столкнулся с таким моментом. Если брать Atmega8, то он при...

Получение температуры с датчика
Доброго времени суток. Такой вопрос, есть какой-нибудь датчик температуры, он подключен к...

Ошибка встроенного датчика температуры MSP430G2553
Доброго времени суток! Сваял программку по измерению температуры от встроенного датчика и...

3
raxp
10192 / 6575 / 492
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
04.05.2014, 13:11 2
...замените операцией с целыми числами: 9.31 = 4655 / 500 = 1862 / 200 = 931 / 100.
1
paskal
455 / 303 / 29
Регистрация: 15.08.2011
Сообщений: 943
04.05.2014, 13:20 3
Лучший ответ Сообщение было отмечено raxp как решение

Решение

Программная эмуляция деления всегда представляет сложность, особенно на 8-битном процессоре. По возможности его надо заменять умножением. В вашем случае когда надо делить на постоянный коэффициент 9.31 это довольно просто. Умножаем на 55 и делим на 512. Результат максимально близок к делению на 9.31. Деление на 512 делается простым сдвигом. Еще проще делить на 256 - просто отбросить младший байт. Но тогда коэффициент 9.31 получится не так точно.
3
[WRG]
52 / 52 / 37
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
04.05.2014, 13:22  [ТС] 4
Во блин, сразу не допер почему то. Ну сейчас то запомню точно

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
04.05.2014, 13:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.05.2014, 13:22

USART передача температуры с датчика в другой мк
Здравствуйте, дорогие форумчане! Помогите пожалуйста разрешить одну проблему! Задача: Есть...

Алгоритм работы датчика температуры и влажности DHT11
Здравствуйте! Решил поделиться алгоритмом работы датчика DHT11. Может быть кому-нибудь пригодится....

PIC16F690. Чтение датчика температуры и влажности DHT-11
pic16f690 не читает DHT11 проблема следующего характера... есть библиотека DHT11 нормально...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru