[uquote="С.Н.",url="/forum/viewtopic.php?p=4534086#p4534086"]Программа осуществляет прямое управление частотой генерации некоего генератора. Все флуктуации кода АЦП будут сразу приводить в флуктуации частоты.
А флуктуации кода АЦП будут! Это реальный мир, а не эмулятор. Сам АЦП обязан щуметь на +- 1 разряд, плюс помехи полезут по земле и через ручку от окружающих систем, опорное напряжение.[/uquote]
1. есть программные флуктуации.
2. есть шум самого АЦП +/- 1...3 разряд
это разные вещи...
1. программные флуктуации мы устранили путём опроса флага переполнения таймера.
2. шум самого АЦП +/- 1...3 разряд... мы пока не устранили... для этого есть аппаратные и программные фильтры.
Gennadiy писал(а):Из функции blink() исключите Counter0_init().
Из функции blink() исключите Counter1_init().... раз мы делаем на таймере 1 то писать надо правильно))
Код: Выделить всё
#define F_CPU 8000000UL // тактовая частота мк
#include <avr/io.h>
#include <avr/interrupt.h>
uint16_t i;
void adc_ini (void)
{
/*** Настройка АЦП ***/
ADCSRA |= (1 << ADEN) // Включение АЦП
|(1 << ADPS1)|(1 << ADPS0); // предделитель на 8
ADMUX |= (0 << REFS1)|(1 << REFS0) // внешний ИОН
|(1 << MUX0)|(1 << MUX1); // вход PC3
}
void adc (void)
{
ADCSRA |= (1 << ADSC); // Начинаем преобразование
while ((ADCSRA&(1 << ADIF))== 0); // Ждем флага окончания преобразования
i = (ADCL|ADCH << 8); // Считываем ADC
}
/*** Настройка Counter1 ***/
void Counter1_init()
{
TCCR1B |= (1 << CS12);
TCCR1B &= ~(1 << CS11);
TCCR1B &= ~(1 << WGM10);
TCCR1B &= ~(1 << WGM11);
TCCR1B |= (1 << WGM12);//режим СТС
TCCR1B &= ~(1 << WGM13);
TCCR1A &= ~(1 << COM1A1);
TCCR1A |= (1 << COM1A0);
DDRB |= (1 << PB1);
}
// инициализация блинков
void blink_ini(void)
{
DDRB|=(1<<PB1);
}
void blink (void)
{
uint16_t u= i;
OCR1A = u;
}
int main(void)
{
DDRD|=(1<<PD0)|(1<<PD1);
adc_ini (); // инициализация adc
Counter1_init(); // инициализация Counter1
blink_ini(); // инициализация блинков
sei();// глобально разрешить прерывания
while(1)
{
while (!(TIFR &=~(1<<OCF1A))); // флаг OCF1A предел счета Т1
TIFR |=(1<<OCF1A); // сброс флаг OCF1A
adc ();
blink ();
}
}
Добавлено after 4 minutes 12 seconds:
а нафига там "инициализация блинков" ?))
Код: Выделить всё
#define F_CPU 8000000UL // тактовая частота мк
#include <avr/io.h>
#include <avr/interrupt.h>
uint16_t i;
void adc_ini (void)
{
/*** Настройка АЦП ***/
ADCSRA |= (1 << ADEN) // Включение АЦП
|(1 << ADPS1)|(1 << ADPS0); // предделитель на 8
ADMUX |= (0 << REFS1)|(1 << REFS0) // внешний ИОН
|(1 << MUX0)|(1 << MUX1); // вход PC3
}
void adc (void)
{
ADCSRA |= (1 << ADSC); // Начинаем преобразование
while ((ADCSRA&(1 << ADIF))== 0); // Ждем флага окончания преобразования
i = (ADCL|ADCH << 8); // Считываем ADC
}
/*** Настройка Counter1 ***/
void Counter1_init()
{
TCCR1B |= (1 << CS12);
TCCR1B &= ~(1 << CS11);
TCCR1B &= ~(1 << WGM10);
TCCR1B &= ~(1 << WGM11);
TCCR1B |= (1 << WGM12);//режим СТС
TCCR1B &= ~(1 << WGM13);
TCCR1A &= ~(1 << COM1A1);
TCCR1A |= (1 << COM1A0);
DDRB |= (1 << PB1);
}
void blink (void)
{
uint16_t u= i;
OCR1A = u;
}
int main(void)
{
DDRD|=(1<<PD0)|(1<<PD1);
adc_ini (); // инициализация adc
Counter1_init(); // инициализация Counter1
sei();// глобально разрешить прерывания
while(1)
{
while (!(TIFR &=~(1<<OCF1A))); // флаг OCF1A предел счета Т1
TIFR |=(1<<OCF1A); // сброс флаг OCF1A
adc ();
blink ();
}
}
Добавлено after 4 minutes 40 seconds:
а нафига там две переменные i... u...
Код: Выделить всё
#define F_CPU 8000000UL // тактовая частота мк
#include <avr/io.h>
#include <avr/interrupt.h>
uint16_t u;
void adc_ini (void)
{
/*** Настройка АЦП ***/
ADCSRA |= (1 << ADEN) // Включение АЦП
|(1 << ADPS1)|(1 << ADPS0); // предделитель на 8
ADMUX |= (0 << REFS1)|(1 << REFS0) // внешний ИОН
|(1 << MUX0)|(1 << MUX1); // вход PC3
}
void adc (void)
{
ADCSRA |= (1 << ADSC); // Начинаем преобразование
while ((ADCSRA&(1 << ADIF))== 0); // Ждем флага окончания преобразования
u = (ADCL|ADCH << 8); // Считываем ADC
}
/*** Настройка Counter1 ***/
void Counter1_init()
{
TCCR1B |= (1 << CS12);
TCCR1B &= ~(1 << CS11);
TCCR1B &= ~(1 << WGM10);
TCCR1B &= ~(1 << WGM11);
TCCR1B |= (1 << WGM12);//режим СТС
TCCR1B &= ~(1 << WGM13);
TCCR1A &= ~(1 << COM1A1);
TCCR1A |= (1 << COM1A0);
DDRB |= (1 << PB1);
}
void blink (void)
{
OCR1A = u;
}
int main(void)
{
DDRD|=(1<<PD0)|(1<<PD1);
adc_ini (); // инициализация adc
Counter1_init(); // инициализация Counter1
sei();// глобально разрешить прерывания
while(1)
{
while (!(TIFR &=~(1<<OCF1A))); // флаг OCF1A предел счета Т1
TIFR |=(1<<OCF1A); // сброс флаг OCF1A
adc ();
blink ();
}
}
Добавлено after 3 minutes 42 seconds:
вместо...
u = (ADCL|ADCH <<

; // Считываем ADC
можно написать так...
u = ADCW; // Считываем ADC
Код: Выделить всё
#define F_CPU 8000000UL // тактовая частота мк
#include <avr/io.h>
#include <avr/interrupt.h>
uint16_t u;
void adc_ini (void)
{
/*** Настройка АЦП ***/
ADCSRA |= (1 << ADEN) // Включение АЦП
|(1 << ADPS1)|(1 << ADPS0); // предделитель на 8
ADMUX |= (0 << REFS1)|(1 << REFS0) // внешний ИОН
|(1 << MUX0)|(1 << MUX1); // вход PC3
}
void adc (void)
{
ADCSRA |= (1 << ADSC); // Начинаем преобразование
while ((ADCSRA&(1 << ADIF))== 0); // Ждем флага окончания преобразования
u = ADCW; // Считываем ADC
}
/*** Настройка Counter1 ***/
void Counter1_init()
{
TCCR1B |= (1 << CS12);
TCCR1B &= ~(1 << CS11);
TCCR1B &= ~(1 << WGM10);
TCCR1B &= ~(1 << WGM11);
TCCR1B |= (1 << WGM12);//режим СТС
TCCR1B &= ~(1 << WGM13);
TCCR1A &= ~(1 << COM1A1);
TCCR1A |= (1 << COM1A0);
DDRB |= (1 << PB1);
}
void blink (void)
{
OCR1A = u;
}
int main(void)
{
DDRD|=(1<<PD0)|(1<<PD1);
adc_ini (); // инициализация adc
Counter1_init(); // инициализация Counter1
sei();// глобально разрешить прерывания
while(1)
{
while (!(TIFR &=~(1<<OCF1A))); // флаг OCF1A предел счета Т1
TIFR |=(1<<OCF1A); // сброс флаг OCF1A
adc ();
blink ();
}
}
и т.д. ))
