Страница 1 из 1

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

Добавлено: Пт апр 12, 2019 14:53:58
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, но никак не получается сделать требуемый период. подскажите, что не так

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

Добавлено: Пт апр 12, 2019 15:46:42
Dimon456
yan671games писал(а):сделать генерацию импульсов
Импульса или импульсов?

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

Добавлено: Пт апр 12, 2019 16:03:33
yan671games
Импульсов

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

Добавлено: Пт апр 12, 2019 16:24:36
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;/*начальное значение таймера*/
А это в обработчике прерывания зачем?

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

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

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

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

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

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

Добавлено: Пт апр 12, 2019 17:06: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;
 }

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

Добавлено: Пн апр 15, 2019 09:16:17
yan671games
А на 8-битном таймере можно этот же процесс сделать? или лучше ШИМ перенести на 8битный?

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

Добавлено: Пн апр 15, 2019 12:02:05
Dimon456
yan671games писал(а):А на 8-битном таймере можно этот же процесс сделать?
Можно и на 8-битном таймере, по аналогии с 16-битным таймером.

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

Добавлено: Чт май 02, 2019 11:07:55
ozonn
я подключал потенциометр к АЦП и переносил значение ADC в OCR