Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
Ramilllllllllll
0 / 0 / 0
Регистрация: 16.04.2017
Сообщений: 29
1

Программный шим atmega8

01.07.2018, 12:32. Просмотров 1595. Ответов 9
Метки нет (Все метки)

Короче нет не одного толкового урока или стати на тему программного шима
всегда какой то ржб свтодиод без объяснений
смог только реализовать аппаратный шим
но я делаю сердце на атмеге8 и надо чтобы 20 ножек было на шиме ()

помогите пожалуйста ,сделайте хотя бы 1 ножку на программном шиме , а остальное доделаю
вот мой код
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
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
  
ISR (TIMER0_OVF_vect)
{
    PORTB=0x04;   // вот в этом методе чего то не хватает 
}
 
void main(void)
{
 
    PORTB=0x04;                                     //конфигурируем порт
    DDRB=0x04;
 
    TCCR0=0x01;                                     //настраиваем таймер
    TCNT0=0x00;
 
    TIMSK=0x01;                                     //разрешаем генерацию прерывания по переполнению таймера T0
 
    asm("sei");                                             //глобально разрешаем прерывания
                                     
    OCR1A =245;
    while (1)
    {
        OCR1A--;
        _delay_ms(50);
    }
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.07.2018, 12:32
Ответы с готовыми решениями:

Atmega8 и ШИМ
Вобщем такой вопрос. Есть Atmega8. Хочу сделать програмный ШИМ на всех ножках кроме PD2, PD3, PB6...

Atmega8 - ШИМ
Здраствуйте! Использую МК Atmega8. Частота 1МГц. 1) как генерировать ШИМ на таймере 0...

Шим на Atmega8.
Суть в следующем! в архиве схема и прошивка , где качал не помню не могу найти источник , но при...

Atmega8 и ШИМ 20кГц
Подскажите как сделать аппаратный ШИМ на 20 кГц на Atmega8? И возможно ли его реализовать использую...

ШИМ от atmega8. LED.
По форуму искал. Проблема в понимании почему не работает??? Просто перегружен проц в Протеусе, уже...

9
COKPOWEHEU
1263 / 908 / 210
Регистрация: 09.09.2017
Сообщений: 3,834
01.07.2018, 13:59 2
Цитата Сообщение от Ramilllllllllll Посмотреть сообщение
Короче нет не одного толкового урока или стати на тему программного шима
Скорее, гугл не понимает твоей альтернативной грамотности "не одного" или ты просто не пытался им воспользоваться. Впрочем, для написания программного ШИМа достаточно понимания что такое ШИМ и как он работает.
Цитата Сообщение от Ramilllllllllll Посмотреть сообщение
чтобы 20 ножек было на шиме
Для начала прикинь на глазок хватит ли быстродействия. Я когда-то делал 30-канальный ШИМ (точнее, BAM, binary angle modulation), там пришлось снижать разрешение до 6 бит, иначе было заметно мерцание.
Цитата Сообщение от Ramilllllllllll Посмотреть сообщение
вот мой код
И что мы должны в нем увидеть?
За форматирование плюс-минус: оно есть, но настройки портов и регистров надо сделать по-человечески, сдвигами и сложениями.
За комментарии минус: настолько бесполезные что лучше бы не было.
За соответствие кода задаче минус: он выставляет PB2 в 1 при старте и больше ничего не делает. Если бы наблюдались хотя бы попытки решить задачу - балл был бы выше.
Так что на первый взгляд 1 / 6.
.
Рекомендую почитать что такое ШИМ и сформулировать словами как он реализуется. Пока что без таймеров, тупо на delay'ах.
.
Собственно, даже если сейчас тебе кто-то выложит готовый код, ты все равно не сумеешь его применить, поскольку нет ни понимания работы ШИМа, ни программерского подхода.
0
Ramilllllllllll
0 / 0 / 0
Регистрация: 16.04.2017
Сообщений: 29
01.07.2018, 14:23  [ТС] 3
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Собственно, даже если сейчас тебе кто-то выложит готовый код, ты все равно не сумеешь его применить, поскольку нет ни понимания работы ШИМа, ни программерского подхода.
я понимаю что такое шим (это регулировка диапазона подачи тока к источнику чем меньше тем ярче )

и этот код не мой а самое лучшее что я нашел в инете

как будет рабочий код (я те скину как у меня все 20 ножек мигают )
0
COKPOWEHEU
1263 / 908 / 210
Регистрация: 09.09.2017
Сообщений: 3,834
01.07.2018, 16:37 4
Цитата Сообщение от Ramilllllllllll Посмотреть сообщение
я понимаю что такое шим (это регулировка диапазона подачи тока к источнику чем меньше тем ярче )
Не угадал. Вообще, в технических вопросах попытка угадать - плохая идея.
А надо поискать в интернете описание этого конкретного метода, лучше всего электрическую схему или хотя бы модель чтобы понять как это работает и только после этого приступать к реализации.
Цитата Сообщение от Ramilllllllllll Посмотреть сообщение
и этот код не мой а самое лучшее что я нашел в инете
Тогда зачем выкладывал?
Цитата Сообщение от Ramilllllllllll Посмотреть сообщение
как будет рабочий код (я те скину как у меня все 20 ножек мигают )
Все равно камера толком не запишет.
0
Ramilllllllllll
0 / 0 / 0
Регистрация: 16.04.2017
Сообщений: 29
01.07.2018, 18:30  [ТС] 5
не вижу в ваших ответах смысла , кроме как у вас день не задался и пошли потролить на форум, я в тупике и мне поможет только кусок кода ну или хотя бы подсказка.
То что я не копи пастнул что такое шим а рассказал своими словами (большего стоить )

вот рабочий код но я не понимаю
1 как оставить только один светодиод
2 когда выполняется метод ISR (TIMER0_OVF_vect)
3 зачем нужно переменные, для буферизации значений скважности ШИМ

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
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
 
unsigned char red=255,   green,     blue;       //переменные, для изменения скважности ШИМ в программе
unsigned char red_b,     green_b,   blue_b;     //переменные, для буферизации значений скважности ШИМ
unsigned char count;                            //переменная- счетчик вызовов обработчика прерываний
unsigned char temp=2;                           //переменная для работы алгоритма смены цветов
 
 
ISR (TIMER0_OVF_vect)  
{
    count++;
    if (count == 0){                                //если счетчик переполнился и принял значение 0
        
        red_b   = red;                             //сохранием значения в буфер
        green_b = green;
        blue_b  = blue;
        
        PORTB = 0x07;       
    }
 
    if (red_b   == count) { PORTB &=~(1<<0);}             //по достижении заданной скважности выводим логический 0 в ножку МК
    if (green_b == count) { PORTB &=~(1<<1);}
    if (blue_b  == count) { PORTB &=~(1<<2);}
}
 
void main(void)
{
 
    PORTB=0x07;                                     //конфигурируем порт
    DDRB=0x07;
 
    TCCR0=0x01;                                     //настраиваем таймер
    TCNT0=0x00;
 
    TIMSK=0x01;                                     //разрешаем генерацию прерывания по переполнению таймера T0
 
    asm("sei");                                     //глобально разрешаем прерывания
 
    while (1)
    {
        if (temp==1) 
        {if (green < 255)   
            green += 1; 
            else temp = 2;}
            
        if (temp==2) 
        {if (red   >   0)   
            red   -= 1;
             else temp = 2;}
    
    if (temp==3)
    {if (blue  < 255)
        blue  += 1;
    else temp = 4;}
    
    if (temp==4)
    {if (green >   0)
        green -= 1;
    else temp = 5;}
    
    
    if (temp==6)
    {if (blue  >   0)
    blue  -= 1; else temp = 1;}
    
    _delay_ms(2);
    }   
}
0
Ethereal
5496 / 1948 / 255
Регистрация: 17.02.2013
Сообщений: 2,895
01.07.2018, 21:37 6
Шим на ноге PORTB.5, такой Шим
C
1
2
3
4
5
6
7
8
9
unsigned char count ;
unsigned int zapolnenie ; // 0..256 = коэффициент заполнения * 256
 
void main(void)
{
    DDRB = 1 << 5 ;
    zapolnenie = 128 ; // меандр
    while (1) PORTB = PORTB & ~(1 << 5) | ((++count < zapolnenie) << 5) ;
}
1
COKPOWEHEU
1263 / 908 / 210
Регистрация: 09.09.2017
Сообщений: 3,834
01.07.2018, 23:04 7
Цитата Сообщение от Ramilllllllllll Посмотреть сообщение
не вижу в ваших ответах смысла , кроме как у вас день не задался и пошли потролить на форум
И снова мимо. Мне не понравилась заведомо ложная фраза "Короче нет не одного толкового урока или стати на тему программного шима". Это довольно детская попытка взять "на слабо". Плюс детские ошибки в орфографии не добавляют хорошего отношения.
А на счет смысла то чего его искать - прямым текстом было сказано "найди описание ШИМ, что это такое и как его обычно делают", благо информации море.
Если вкратце, ШИМ - широтно-импульсная модуляция, то есть формирование импульсов и пауз различной ширины. Обычно стараются чтобы импульс и пауза вместе составляли всегда одинаковый интервал времени. Допустим, период сигнала равен 1 мс, тогда заполнению 40% соответствует 400 мкс импульс и 600 мкс пауза. 400 мкс на выводе будет лог.1, потом 600 мкс - лог.0. Потом новый цикл. Управление током или еще чем-то это лишь одно из применений ШИМа. Между прочим, с этой задачей справляются и другие методы - цифровые потенциометры, ЦАП, ВАМ и т.д.
Отсюда простейший нерегулируемый ШИМ на PB1 с заполнением 40% и периодом 1 мс будет выглядеть так
C
1
2
3
4
5
6
while(1){
  PORTB |= (1<<1);
  _delay_us(400);
  PORTB &=~(1<<1);
  _delay_us(600);
}
А теперь переходим к самому веселому, о чем предупреждал в начале. Пока ты не разберешься как оно работает, ты не сможешь встроить в свой проект. Тебе ведь надо чтобы несколько каналов обрабатывались независимо друг от друга, да еще, наверняка, не со статичными значениями, а с анимацией, пусть и примитивной.
2
tatarva87
98 / 19 / 8
Регистрация: 23.03.2018
Сообщений: 94
02.07.2018, 08:15 8
В своих проектах я использую такой прием: сначала определяю временные интервалы (период) ШИМ сигнала, которым будут управляться яркость моих светодиодов и сколько этапов яркости мне будет необходимо.
1
Миниатюры
Программный шим atmega8  
tatarva87
98 / 19 / 8
Регистрация: 23.03.2018
Сообщений: 94
02.07.2018, 08:19 9
В данном случае я понимаю - мне достаточно шим сигнал разделить на 11 частей. (это - 11 степеней яркости светодиода) этого вполне хватит. Если не хватит можно еще на большее число разделить.
1
Миниатюры
Программный шим atmega8  
tatarva87
98 / 19 / 8
Регистрация: 23.03.2018
Сообщений: 94
02.07.2018, 09:28 10
Лучший ответ Сообщение было отмечено Ramilllllllllll как решение

Решение

Определяю для моего проекта достаточный период сигнала - 2,5 мс. Определив себе количество регулировок яркостью -11 степеней вычисляю длину каждого из 11 участков: 2,5мс/11 = примерно 250 мкс.
Устанавливаю время трабатывания таймер 0 равным этому значению.
Определяю 5 переменных, необходимых для работы шим:
C++
1
volatile unsigned char shim0, shim1, shim2, shim3, shim4;
В начале функции майн определяю общее количесвто степеней изменения сигнала
C++
1
shim4=11;
и внутри функции таймера 0 пишем
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
switch (shim0)
{
case 0:
if (shim3==0)
{
PORTB&=~0b00000001;  выключение выбронного порта при shim3=0
}
else
{
shim1=shim4;
shim2=shim3;
PORTB|=0b00000001; //включение ножки
shim0++;
}
break;
default:
if (shim1==0)
{
shim0=0;
}
else
{
shim1--;
if (shim2==0)
{
PORTB&=~0b00000001;
}
else
{
shim2--;
}
}
}
для управления свечением лампы - необходимо менять значение переменной shim3 от 0 до 11.
1
02.07.2018, 09:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.07.2018, 09:28

Не работает ШИМ МК AtMega8
Делаю импульсный блок питания 30В, 5А. Пишу не сложную прошивку для МК AtMega 8, в протеусе все...

ШИМ и АЦП в Atmega8
Мне нужно управлять током полевого транзистора. Для этого я снимаю напряжение с резистора,...

Синус с помощью ШИМ на AtMega8
Здравствуйте! Раньше дел с контроллерами не имел, поэтому решил начать с малого. Взял я ...


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

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

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