53 / 53 / 37
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
1

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

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

Author24 — интернет-сервис помощи студентам
Есть следующий код, выводит значение, считанное с АЦП во вторую строку на экранчике побитово. Проблема в том, что АЦП не читает значение, все время на выходе 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.05.2014, 12:35
Ответы с готовыми решениями:

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

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

Проблема с АЦП на atmega48
Здравствуйте. Возник вопрос по поводу ацп на otmyko48 пишу в winavr #ymstude &lt;avr/io.h&gt;...

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

АЦП для термопары (датчика давления)
Здравствуйте, в электронике не специалист, нужна ваша помощь, есть необходимость замерять и...

3
10231 / 6609 / 498
Регистрация: 28.12.2010
Сообщений: 21,156
Записей в блоге: 1
04.05.2014, 13:11 2
...замените операцией с целыми числами: 9.31 = 4655 / 500 = 1862 / 200 = 931 / 100.
1
484 / 331 / 32
Регистрация: 15.08.2011
Сообщений: 1,071
04.05.2014, 13:20 3
Лучший ответ Сообщение было отмечено raxp как решение

Решение

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

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

Подключение датчика температуры
Всех приветствую! Проблема следующая, имеется монитор на системном блоке (не знаю как он конкретно...

Подключение датчика температуры
Добрый день! Изучаю работу контроллера Siemens S7-300, дали задание подключить датчик температуры и...

Обрыв датчика температуры
HELP!!! Оторвался провод от фишки датчика температуры со стороны стиралки. Как узнать , какого...

Термистор в качестве датчика температуры
Использую Arduino Uno + резистор 10 кОм и термистор 4.7 кОм. Хочу измерить температуру. С...

Калибровка аналогово датчика температуры
Помогите пожалуйста с моей проблемой. Мне нужно сделать таблицу зависимости сопротивления...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru