Обсуждаем контроллеры компании Atmel.
Ответить

Генератор, скважность которого можно изменять потенциометром

Пт апр 12, 2019 14:53:58

Я всех категорически приветствую. Передо мной поставили задачу: реализовать на микрухе ATMega48PA ШИМ генератор скважность которого можно изменять потенциометром, а также на другом выходе этой микрухи сделать генерацию импульсов длительностью 100микросекунд (+/-20мкс), генерироваться они должны 1 раз в 4 секунды. с ШИМ проблем не возникло, а, вот, с импульсами ничего не выходит
Код:
#define F_CPU 8000000UL
#define XTAL 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
static uint8_t s;
void timer0_init (void){
   DDRD=(1<<PD0); /* PD0 в режим выхода*/
   TCCR0B|=(1<<CS02)|(1<<CS00);/*Предделитель = 1024*/
   TIFR0 = (1<<TOV0);/*флаг прерывания по переполнению*/
   TCNT0 = 255;
   s = 0;
   TIMSK0=(1<<TOIE0);//прерывание по переполнению таймера 1
   sei();//Разрешить прерывания
}
ISR(TIMER0_OVF_vect)
{
PORTD=(1<<s);
   
   s++;
   if(s==120)
   {
   
   s=0;
   
   }   
   TCNT0= 255;/*начальное значение таймера*/
   
   }

int main(void)
{   timer0_init();
   while(1)
   {
   }
}


попытался сделать через прерывания по переполнению таймера 0, но никак не получается сделать требуемый период. подскажите, что не так

Re: Генератор, скважность которого можно изменять потенциоме

Пт апр 12, 2019 15:46:42

yan671games писал(а):сделать генерацию импульсов
Импульса или импульсов?

Re: Генератор, скважность которого можно изменять потенциоме

Пт апр 12, 2019 16:03:33

Импульсов

Re: Генератор, скважность которого можно изменять потенциоме

Пт апр 12, 2019 16:24:36

volatile static uint8_t s;
upd: Хотя volatile тут не нужен, тут правильнее объявить s статичной, но внутри обработчика прерывания.

Добавлено after 2 minutes 56 seconds:
Re: Генератор, скважность которого можно изменять потенциометром
PORTD=(1<<s);
А это что такое?

Добавлено after 1 minute 15 seconds:
Re: Генератор, скважность которого можно изменять потенциометром
TCNT0= 255;/*начальное значение таймера*/
А это в обработчике прерывания зачем?
Последний раз редактировалось Z_h_e Пт апр 12, 2019 16:36:40, всего редактировалось 1 раз.

Re: Генератор, скважность которого можно изменять потенциоме

Пт апр 12, 2019 16:24:50

yan671games писал(а):Импульсов
И так
yan671games писал(а):импульсов длительностью 100микросекунд
yan671games писал(а):генерироваться они должны 1 раз в 4 секунды
значит 1000 импульсов длительностью 100мкс, пауза между импульсами пусть будет то же 100мкс (должна же быть пауза между импульсами?) и вся это пачка импульсов повторяется 1 раз в 4 секунды.

Re: Генератор, скважность которого можно изменять потенциоме

Пт апр 12, 2019 16:58:16

йзначит 1000 импульсов длительностью 100мкс, пауза между импульсами пусть будет то же 100мкс (должна же быть пауза между импульсами?) и вся это пачка импульсов повторяется 1 раз в 4 секунды.


Нет, один импульс длительностью 100мкс, который повторяется раз в 4 секунды

Re: Генератор, скважность которого можно изменять потенциоме

Пт апр 12, 2019 17:06:54

yan671games писал(а):Нет, один импульс длительностью 100мкс, который повторяется раз в 4 секунды
Но вот так бы и сразу.
Спойлер
Код:
#define F_CPU 8000000UL
#define XTAL 8000000UL
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay_basic.h>

ISR(TIMER1_COMPA_vect){
 
PORTD |= (1<<(PIND0));
_delay_loop_2(199);   
PORTD &= (~(1<<(PIND0)));   
   
}

int main()
 {
   
DDRD |=(1<<DDD0);
PORTD |=(0<<PIND0);   
   
// Timer/Counter 1 initialization
// Timer Period: 3,9999 s
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (1<<CS12) | (0<<CS11) | (1<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x7A;
OCR1AL=0x10;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 1 Interrupt(s) initialization
TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (1<<OCIE1A) | (0<<TOIE1);

 // Global enable interrupts
sei();
 
    while (1)
      ;
   return 0;
 }

Re: Генератор, скважность которого можно изменять потенциоме

Пн апр 15, 2019 09:16:17

А на 8-битном таймере можно этот же процесс сделать? или лучше ШИМ перенести на 8битный?

Re: Генератор, скважность которого можно изменять потенциоме

Пн апр 15, 2019 12:02:05

yan671games писал(а):А на 8-битном таймере можно этот же процесс сделать?
Можно и на 8-битном таймере, по аналогии с 16-битным таймером.

Re: Генератор, скважность которого можно изменять потенциоме

Чт май 02, 2019 11:07:55

я подключал потенциометр к АЦП и переносил значение ADC в OCR
Ответить