Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 20.11.2017
Сообщений: 8
1

Как сделать нулевой ШИМ сигнал на avr

30.11.2017, 20:21. Просмотров 691. Ответов 2

Здравствуйте! Написал программу, которая генерирует ШИМ в зависимости от напряжения, которое изменяется реостатом в диапазоне от 0 до 4В. Проблема в том, что реостат чисто физически не может выдавать ноль, т.к. всегда присутствуют малые токи. Из - за этого не могу на осциллографе получить чистый 0, а получаются пики. Типо этого ___|___|___|___
Пробовал приравнять значение H к нулю при достижении минимального значения напряжения, выключить порт при минимальном значении H(тогда вообще перестает работать). Помогите, пожалуйста, справиться с этой задачей.
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
#define F_CPU 10000000UL
 
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdint.h>
#include <util/delay.h>
#include "HD44780.h"
 
 
/* Инициализация переменных */
volatile uint32_t T = F_CPU/1000; // Период счёта ТС1 = тактовая частота / частота генерируемого сигнала (1000 Гц)
volatile uint32_t H = 0; // переменная для длительности импульса
volatile uint32_t p = 0;
 
//volatile uint16_t U = 0;
// Функция запуска преобразования АЦП и чтения результата
volatile unsigned int read_adc (unsigned char adc_input) {
    // Сбрасываем прошлый канал
    ADMUX &= ~((1 << MUX0) | (1 << MUX1) | (1 << MUX2) | (1 << MUX3) | (1 << MUX4));
    // И выбираем новый
    ADMUX |= adc_input;
    // Задержка на установление опорного напряжения
    _delay_us(10);
    // Запуск преобразования АЦП
    ADCSRA |= (1 << ADSC);
    // Ожидание окончания преобразования
    while ((ADCSRA & (1 << ADIF))==0);
    // Сброс флага прерывания
    ADCSRA |= (1 << ADIF);
    return ADC;
};
 
/* Обработчик прерываний */
ISR(TIMER1_CAPT_vect) {
        if (H < 0.350)
        { DDRB = 0x00;
        PORTB = 0x00;
        }
        else
        { DDRB = 0xff;
            
        }
        OCR1A = H;
 
}
 
int main(void)
{   HD44780Init();
    HD44780Clear();
    HD44780PortWCmd(0b00010100); //сдвиг курсора вправо
 
/* Настройка ножки OC1A (PB5) на вывод */
    DDRB |= (1 << 5);
    PORTB &= ~(1 << 5);
    
    /* Инициализация ТС1 */
    
    TCNT1 = 0;
    ICR1 = T;
    OCR1A = H;
    
    TCCR1A = (1 << COM1A1) | (1 << WGM11);              // Выбран режим Fast PWM (№14) с пределом счёта в ICR1   
    TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS10); // с системным тактовым сигналом без предделителя
    TCCR1C = 0;
    
    TIMSK = (1 << TICIE1); // Разрешение прерывания по захвату состояния TCNT1 = ICR1
    
    sei(); // глобальное разрешение прерываний
    
    /* Инициализация модуля АЦП */
    // разрешение работы АЦП, предделитель тактовой частоты равен 128 
    ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); 
    // источник опорного сигнала -- AVCC, канал ввода - однополярный вход PF0 
    ADMUX = (1 << REFS0); 
    
    while(1)
    {
        HD44780PortWCmd(0x80); //HD44780Gotoxy(0,0)
        HD44780Clear();
        
    
        p = read_adc(PB5);
        H = (read_adc(PB5)*1.20)*T/1000;
        if (p<= 0.03) H=0;
 
 
//HD44780WNumXY(0, 0, H );
    _delay_ms(50);
    }
}
Добавлено через 31 минуту
...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.11.2017, 20:21
Ответы с готовыми решениями:

AVR ШИМ
Помогите пожалуйста организовать трехфазный ШИМ на AVR. У меня есть AT90PWM3B, как необходимо...

Цифровой сигнал в ШИМ
Доброго времени суток комрады. Интересует меня вот такой вопрос: есть три цифровых сигнала с...

Уменьшение разрядности ШИМ в AVR
Реально ли уменьшить разрядность ШИМ? Нужна частота порядка 250 Кгц........

Шим на микроконтролере avr atmega16
на всех сайтах искал про шим у меня вопрос нужно реализовать шим на микроконтролере авр ...

2
1 / 1 / 0
Регистрация: 29.10.2017
Сообщений: 15
30.11.2017, 20:55 2
Попробуй при определённых (минимальных) значениях таймер просто обнулять (TCNT = 0). Мне в своё время удалось такой трюк выполнить
1
125 / 43 / 12
Регистрация: 23.03.2018
Сообщений: 169
25.03.2018, 19:55 3
Вставляй в программу буферный регистр.
Значение, полученное из АЦП переноси в этот регистр с таким условием- если значение на ацп равно напряжению на минимуме реостата то переноси в регистр ноль. а значение регистра переносишь ни шим

Добавлено через 6 минут
я оказывается не все правильно понял.
Я при использовании шим делаю примерно так:

C
1
2
3
4
5
6
7
8
switch (H)
{
case 0:
PORTB.5=0;  // порт на который выходной сигнал идет
Break;
default:
прописать команду запуска ШИМ
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.03.2018, 19:55

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

ШИМ 192кгц на AVR - возможно?
Подскажите пожалуйста, а возможно ли реализовать ШИМ с частотой 192кГц на AVR?

AVR ATmega64 Режимы ШИМ
Задача: Мигать светодиодом. Вкл. состояние 200 мс, выкл. 700 мс. Для реализации использовать таймер...

ШИМ -> Аналоговый сигнал
Есть ШИМ сигнал 65кГц, который подается на затвор MOSFET-N ключа IRLML0060, на сток подается...

Можно ли сделать Repeat сигнал с помощью USB Wi Fi чтобы сигнал дошел до улицы
Я с ноутбука раздал Wi Fi интернет, у мя в ноуте DSL(через UTP) интернет, раздал с командной...


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

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

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