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

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 4
Зарегистрирован: Пт апр 12, 2019 14:20:37

Сообщение yan671games »

Я всех категорически приветствую. Передо мной поставили задачу: реализовать на микрухе 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, но никак не получается сделать требуемый период. подскажите, что не так
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

yan671games писал(а):сделать генерацию импульсов
Импульса или импульсов?
Реклама
Родился
Сообщения: 4
Зарегистрирован: Пт апр 12, 2019 14:20:37

Сообщение yan671games »

Импульсов
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

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 раз.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Эиком - электронные компоненты и радиодетали
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

yan671games писал(а):Импульсов
И так
yan671games писал(а):импульсов длительностью 100микросекунд
yan671games писал(а):генерироваться они должны 1 раз в 4 секунды
значит 1000 импульсов длительностью 100мкс, пауза между импульсами пусть будет то же 100мкс (должна же быть пауза между импульсами?) и вся это пачка импульсов повторяется 1 раз в 4 секунды.
Реклама
Родился
Сообщения: 4
Зарегистрирован: Пт апр 12, 2019 14:20:37

Сообщение yan671games »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3614935#p3614935"]йзначит 1000 импульсов длительностью 100мкс, пауза между импульсами пусть будет то же 100мкс (должна же быть пауза между импульсами?) и вся это пачка импульсов повторяется 1 раз в 4 секунды.[/uquote]

Нет, один импульс длительностью 100мкс, который повторяется раз в 4 секунды
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

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;
 }
Родился
Сообщения: 4
Зарегистрирован: Пт апр 12, 2019 14:20:37

Сообщение yan671games »

А на 8-битном таймере можно этот же процесс сделать? или лучше ШИМ перенести на 8битный?
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

yan671games писал(а):А на 8-битном таймере можно этот же процесс сделать?
Можно и на 8-битном таймере, по аналогии с 16-битным таймером.
Вымогатель припоя
Сообщения: 522
Зарегистрирован: Чт янв 21, 2016 15:59:10

Сообщение ozonn »

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

Вернуться в «AVR»