1 / 1 / 0
Регистрация: 07.05.2016
Сообщений: 17
1

Шим на микроконтролере avr atmega16

28.04.2017, 14:17. Показов 1512. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
на всех сайтах искал про шим

у меня вопрос нужно реализовать шим на микроконтролере авр когда нажимаем SW1 (котороя равна нулю ) нужно генерировать шим сигнал в порте Д пин 6 чтобы диод загорел
СХЕМУ ПРОЕКТА Я ВЛОЖИЛ

ВОТ КОД Я СОЗДАЛ ОТДЕЛНЫЙ ФАЙЛ ДЛЯ ИНИЦИАЛИЗАЦИИ
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/* initialization file */
 
#include <mega16.h>
#include "defs.h"
                                          
 
/*
 * most intialization values are generated using Code Wizard and depend on clock value
 */
void Init_initController(void)
{
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTA=0x00;
DDRA=0x00;
 
// Port B initialization
PORTB=0x00;
DDRB=0x00;
 
// Port C initialization
PORTC=0x00;
DDRC=0x00;
 
// Port D initialization
PORTD=0b00100000; // D.5 needs pull-up resistor
DDRD= 0b01000000; // D.6 is LED
 
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
 
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 13.184 kHz = CLOCK/256
// Mode: CTC top=OCR1A
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
 
TCCR1A=0x00;
TCCR1B=0x0D;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
 
// 1 sec = 7200 counts = 1C20H counts 
// 1C20H = 1CH (MSB) and 20H (LSB)
OCR1AH=0x1C;
OCR1AL=0x20;
 
OCR1BH=0x00;
OCR1BL=0x00;
 
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
 
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
 
// Timer(s)/Counter(s) Interrupt(s) initialization
// (Timer 1 Compare Match A Interrupt)
TIMSK=0x10;
 
// USORT initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USORT Receiver: On
// USORT Transmitter: On
// USORT Mode: Asynchronous
// USORT Baud rate: 9600
UCSRA=0x00;
UCSRB=0xD8;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x2F;
 
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
 
// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/2048  
// Write 2 consecutive values to enable watchdog
WDTCR=0x1F;
WDTCR=0x0F;
 
}
ВОТ САМ КОД
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
/*********************************************
Project : Test software
**********************************************
Chip type: ATmega16
Clock frequency: 7.3728 MHz
Compilers:  CVAVR 1.x and 2.x
*********************************************/
 
#include <mega16.h>
 
#include <stdio.h>
#include <delay.h>  
#include <string.h> 
#include <stdlib.h>
#include "defs.h"    
 
//*************************************************************************************************
//*********** BEGIN SERIAL STUFF (interrupt-driven, generated by Code Wizard) *********************
//*************************************************************************************************
 
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
 
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
 
// USORT Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
 
#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
 
// This flag is set on USORT Receiver buffer overflow
bit rx_buffer_overflow;
 
// USORT Receiver interrupt service routine
interrupt [USORT_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {
   rx_buffer[rx_wr_index]=data;
   if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
   if (++rx_counter == RX_BUFFER_SIZE)
      {
      rx_counter=0;
      rx_buffer_overflow=1;
      };
   };
}
 
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USORT Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif
 
// USORT Transmitter buffer
#define TX_BUFFER_SIZE 8
char tx_buffer[TX_BUFFER_SIZE];
 
#if TX_BUFFER_SIZE<256
unsigned char tx_wr_index,tx_rd_index,tx_counter;
#else
unsigned int tx_wr_index,tx_rd_index,tx_counter;
#endif
 
// USORT Transmitter interrupt service routine
interrupt [USORT_TXC] void usart_tx_isr(void)
{
if (tx_counter)
   {
   --tx_counter;
   UDR=tx_buffer[tx_rd_index];
   if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
   };
}
 
#ifndef _DEBUG_TERMINAL_IO_
// Write a character to the USORT Transmitter buffer
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while (tx_counter == TX_BUFFER_SIZE);
#asm("cli")
if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
   {
   tx_buffer[tx_wr_index]=c;
   if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
   ++tx_counter;
   }
else
   UDR=c;
#asm("sei")
}
#pragma used-
#endif
 
//*************************************************************************************************
//********************END SERIAL STUFF *********************************************************
//*************************************************************************************************
 
/*
 * Timer 1 Output Compare A is used to blink LED
 */
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
LED1 = ~LED1; // invert LED    
}                                  
 
/*
 * main function of program
 */
void main (void)
{          
unsigned char temp;
 
    Init_initController();  // this must be the first "init" action/call!
    #asm("sei")             // enable interrupts
    LED1 = 1;               // initial state, will be changed by timer 1
 
    while(TRUE)
    {
        wdogtrig();         // call often else processor will reset
        if(rx_counter)     // if a character is available on serial port
        {
            temp = getchar();
            if(temp == '?') 
                printf("\r\nSwVersion:%d.%d\r\n", SW_VERSION/10, SW_VERSION%10); 
            else
                putchar(temp+1);        // echo back the character + 1 ("a" becomes "b", etc)   
        }             
 
        if(SW1 == 0)        // pressed
        {
            delay_ms(30);   // debounce switch
            if(SW1 == 0)    
            {                // so LED will blink slow or fast
                while(SW1==0)
                    wdogtrig();    // wait for release
                if(OCR1AH == 0x1C) // alternate before values and values/4 for OCR1A register 
                    {TCNT1 = 0; OCR1AH = 0x07; OCR1AL = 0x08;}
                else     
                    {TCNT1 = 0; OCR1AH = 0x1C; OCR1AL = 0x20;}            
            }                
        }            
    }// end main loop 
}
МОЖЕТЕ ПОМОЧЬ СДЕЛАТЬ НАКОНЕЦТО ЭТОТ ШИМ А ТО Я УЖЕ
Миниатюры
Шим на микроконтролере  avr atmega16  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.04.2017, 14:17
Ответы с готовыми решениями:

ШИМ на ATmega16
У кого есть рабочий исходник на ассемблере, где в порт выдается ШИМ-сигнал по таймеру (желательно...

AtMega16. ШИМ на Т/С1. Proteus.
Необходимо сделать ШИМ на Т/С1 для изменения среднего напряжения на лампочке. Вот код программы: ...

ШИМ на ATMega16 cо скважностью 3
Помогитет написать программу: Выдать последовательность прямоугольных импульсов скважности 3 на...

16-битный ШИМ в ATmega16
Доброго времени суток. Возникла проблема - в даташите написано, что ШИМ у 16-й атмеги есть на...

16
1176 / 653 / 111
Регистрация: 15.05.2012
Сообщений: 4,012
28.04.2017, 15:54 2
Цитата Сообщение от AGN Посмотреть сообщение
нужно генерировать шим сигнал в порте Д пин 6 чтобы диод загорел
C
1
PORTD.6= 1;
В чём проблема?

Добавлено через 49 секунд
Цитата Сообщение от AGN Посмотреть сообщение
нужно реализовать шим на микроконтролере авр
А как написано в задании?
0
1 / 1 / 0
Регистрация: 07.05.2016
Сообщений: 17
28.04.2017, 16:17  [ТС] 3
в задании написано так

Шаговый управления двигателем (ШИМ)

разработать систему, которая будет генерировать импульсы с переменной шириной и периодом времени(которая даем мы).
Изменение периода и длительность импульса будет находиться в режиме реального времени.
0
1176 / 653 / 111
Регистрация: 15.05.2012
Сообщений: 4,012
28.04.2017, 16:32 4
Цитата Сообщение от AGN Посмотреть сообщение
которая даем мы
Чем планируется управлять? Кнопками?

Добавлено через 41 секунду
Или по RS232?

Добавлено через 10 секунд
Или ещё как-то?
0
1 / 1 / 0
Регистрация: 07.05.2016
Сообщений: 17
28.04.2017, 16:41  [ТС] 5
Кнопками
0
1176 / 653 / 111
Регистрация: 15.05.2012
Сообщений: 4,012
28.04.2017, 16:48 6
Т.е. две кнопки управляют шириной (+ и -) и две кнопки управляют периодом (+ и -)?
0
1 / 1 / 0
Регистрация: 07.05.2016
Сообщений: 17
28.04.2017, 17:14  [ТС] 7
А можно с помошью RS232 ? я просто сначала думал реализовать с кнопками
0
1176 / 653 / 111
Регистрация: 15.05.2012
Сообщений: 4,012
28.04.2017, 17:16 8
Можно как угодно.
0
1 / 1 / 0
Регистрация: 07.05.2016
Сообщений: 17
28.04.2017, 17:27  [ТС] 9
и как сделать с помошью RS232 знаю что он делаеть вроде эту задачу на картинке
преобразоваеть биты 0 в биты 1
Миниатюры
Шим на микроконтролере  avr atmega16  
0
1176 / 653 / 111
Регистрация: 15.05.2012
Сообщений: 4,012
28.04.2017, 17:30 10
МАХ232 преобразует уровни +/-12в (стандарт физического RS232) в ТТЛ уровни и наоборот. Для сопряжения микроконтроллера с ПК нужна эта микросхема или подобная.
0
1 / 1 / 0
Регистрация: 07.05.2016
Сообщений: 17
28.04.2017, 17:37  [ТС] 11
то есть вы говорите что можно менять ширину импульса и период времени назначить с пк я вас правильно понял
0
1176 / 653 / 111
Регистрация: 15.05.2012
Сообщений: 4,012
28.04.2017, 17:41 12
Да.
Можно, конечно, с другого микроконтроллера или устройства, которое поддерживает RS232.
0
1 / 1 / 0
Регистрация: 07.05.2016
Сообщений: 17
28.04.2017, 17:55  [ТС] 13
(??так как мне сделать чтобы с помощью RS232 генерировать этот ШИМ в момент когда я нажимаю в кнопку SW1 чтобы зажигать этот диод лед ) Я ДАЮ С ПК ПЕРИОД И ШИРИНУ ШИМА ПОТОМ ОН(RS232) ПРЕОБРАЗОВАЕТЬ В TTL И КОГДА НАЖИМАЮ SW1 МИКРОКОНТРОЛЛЕР ГЕНЕРИРОВАЕТЬ ШИМ И ДИОД СВЕТИТ ТАК ВЫ ГОВОРИТЕ Я ВАС ПРАВИЛЬНО ПОНЯЛ
0
1176 / 653 / 111
Регистрация: 15.05.2012
Сообщений: 4,012
28.04.2017, 18:01 14
Да, всё верно.
0
1 / 1 / 0
Регистрация: 07.05.2016
Сообщений: 17
11.05.2017, 18:06  [ТС] 15
Спасибо справился сам кому интересно я залил проект
Вложения
Тип файла: rar pwm.rar (32.1 Кб, 10 просмотров)
0
0 / 0 / 0
Регистрация: 14.09.2017
Сообщений: 3
26.09.2017, 07:24 16
AGN, добрый день подскажите как составить программный шим, хочу сделать плавное включчение лампы на Attiny13 пока в инете ничего подходящего не нашел
0
612 / 373 / 69
Регистрация: 21.09.2008
Сообщений: 1,277
30.09.2017, 14:24 17
Andreev_51, Вас в Гугле забанили?
Как один вариант реализации.
0
30.09.2017, 14:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.09.2017, 14:24
Помогаю со студенческими работами здесь

AtMega16 T1 ШИМ CTC прерывания по OCR - мин. длительность?
Приветствую Форумчане! в моей задаче мне нужно при помощи микроконтроллера avr генерить импульсы...

Микроконтроллер AVR. Atmega16
Дан массив 16х16. 1)Найти сумму элементов главной диагонали. 2) Найти наименьший элемент побочной...

ПО для AVR МК Atmega16
помогите кто чем может

Светофор AVR Atmega16
помогите написать программу для 7 сегментника для красного цвета 25 секунд для красного и жолтого

Реверс двигателя (ATMega16) - AVR
Код с помощью которого двигатель вращается в одном направлений по часовой стрелке. А нужно...

Программа для ATmega16 (AVR Assembler)
Пожалуйста, помогите написать программу! Вычислить K=A+B-C, где A, B и C – любые 8-битные целые...

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


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

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

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