Вт мар 02, 2021 19:20:46
#define PERIOD_kHz 7999 //настроим Т1 на 1мс (1 кГц) = 8000000/1000Гц=8000-1=7999
#define IGLA 400 //Импульс 40.0%
int PWR;
//*******Timer1 output compare A interrupt service routine***********************
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
timer++; //таймер шим 1кГц
PWR=(PERIOD_kHz*(1000-IGLA))*0.001;
OCR1B=PWR; //т.к С ИНВЕРСИЕЙ - считаем так
} // end Timer1
//**********************************************************************
и настройки таймера1 не буду писать
Вт мар 02, 2021 19:31:42
Вт мар 02, 2021 19:36:06
Вт мар 02, 2021 19:52:56
Вт мар 02, 2021 20:21:22
Вт мар 02, 2021 20:29:41
Ср мар 03, 2021 12:39:14
if(OCR1B>0 && OCR1B<PWR) {adc_max_pwr=read_adc(0);} //т.е. когда период ШИМ Toff то меряем напругу без фильтрации
Ср мар 03, 2021 12:46:21
Ср мар 03, 2021 13:11:20
Ср мар 03, 2021 14:37:02
Ср мар 03, 2021 15:27:48
А я вот не хочу отвечать даже! вообще не о том речь!neid писал(а):Вопрос в другом почему это условие не отрабатывает( какого ему пинка не хватает? или чего я не понимаю или не знаю?
#define IGLA 400 //Импульс 40.0%
Ср мар 03, 2021 16:00:07
Ср мар 03, 2021 16:23:09
Ср мар 03, 2021 16:33:40
Ср мар 03, 2021 19:19:54
удалил по причине невнимательности Starichok51
Ср мар 03, 2021 20:55:53
Ср мар 03, 2021 21:23:39
Чт мар 04, 2021 06:32:19
ну писал, и что из этого? если он нигде в вычислениях не участвует в явном виде, то он не нужен.neid писал(а):ранее писал же это коэффициент для бегущее среднее
ну обсуждали, и что из этого? если PWR - постоянная величина, которую можно вычислить один раз, то не нужно вычислять ее бессчетное число раз в прерыванииneid писал(а):за этим, тоже обсуждали if(OCR1B>0 && OCR1B<PWR)
если удобнее, ну и ладно.neid писал(а):пока мне так удобней
// тут все твои ранее сделанные объявления
// объявляем переменную-флаг
byte overflow_yes = 0;
// добавляем прерывание по переполнению
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
overflow_yes = 0;
}
// тут все твои ранее орисанные функции
void main(void)
{
// тут все твоя ранее сделанная инициальзация
// настройки таймера несколько изменяем
// чтобы прерывания не наступили сразу же после запуска таймера, сначала устанавливаем все регистры
// и только потом настраиваем режим и делаем пуск таймера
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x1F; // 1F3F(7999) - 1кГц - 1.0000 ms
OCR1AL=0x3F;
OCR1BH=0x00;
OCR1BL=0x00;
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (1<<COM1B0) | (1<<WGM11) | (1<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (1<<WGM13) | (1<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
TIMSK=(1<<OCIE1A) | (1<<TOIE1);
// и теперь разрешаем прерывания
sei;
while(1)
{
while (overflow_yes == 0) // пока прерывание не наступило,
; // "топчемся на месте" и ничего не делаем
overflow_yes = 0; // прерывание наступило - сбрасываем флаг
// тут всё ранее написанное "тело" цикла while(1)
}
}
Чт мар 04, 2021 09:05:31
volatile uint16_t rezultat2;
// глубина буфера усреднения. чем больше, тем сильнее фильтрация и медленнее работа
// очень хорошо, если число кратно степени двойки (т.е. 1, 2, 4, 8, 16, 32, 64 и т.д.)
#define AVERAGE_DEPTH 8
// функция получает результат очередного замера и возвращает отфильтрованное значение
__inline static uint16_t get_average (uint16_t val){
static uint16_t buf[AVERAGE_DEPTH];
static uint8_t cur;
uint32_t sum = 0;
buf[cur++] = val;
if(cur >= AVERAGE_DEPTH) cur = 0;
for(uint8_t i=0; i < AVERAGE_DEPTH; i++) sum += buf[i];
return sum / AVERAGE_DEPTH;
}
// Timer1 output compare A interrupt service routine
ISR(TIMER1_COMPA_vect)
{
// Start the AD conversion
ADCSRA|=(1<<ADSC);
while ((ADCSRA & (1<<ADIF))==0);
ADCSRA|=(1<<ADIF);
rezultat2 = get_average(ADCW);
timer++; //таймер шим 1кГц
}
// Voltage Reference: AVCC pin
#define ADC_VREF_TYPE ((0<<REFS1) | (1<<REFS0) | (0<<ADLAR))
#define PERIOD_kHz 7999UL //настроим Т1 на 1мс (1 кГц) = 8000000/1000Гц=8000-1=7999
#define IGLA 400 //Импульс 40.0%
int main()
{
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 8000,000 kHz
// Mode: Fast PWM top=ICR1
// OC1A output: Disconnected
// OC1B output: Inverted PWM
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer Period: 1 ms
// Output Pulse(s):
// OC1B Period: 1 ms Width: ... ms
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (1<<COM1B0) | (1<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (1<<WGM13) | (1<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
TCNT1=0;
ICR1=0x1F3F; // 1F3F(7999) - 1кГц - 1.0000 ms
OCR1A=0;
OCR1B = (PERIOD_kHz*(1000-IGLA))*0.001; // 40%
// Timer/Counter 1 Interrupt(s) initialization
TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (1<<OCIE1A) | (0<<TOIE1);
// ADC initialization
// ADC Clock frequency: 125,000 kHz
// ADC Voltage Reference: AVCC pin
// ADC Auto Trigger Source: ADC Stopped
// Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: On
// ADC4: On, ADC5: On
DIDR0=(0<<ADC5D) | (0<<ADC4D) | (0<<ADC3D) | (0<<ADC2D) | (0<<ADC1D) | (0<<ADC0D);
ADMUX= 0 | ADC_VREF_TYPE;
ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
ADCSRB=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);
sei();
while (1)
{
// Place your code here
}
}
Чт мар 04, 2021 09:52:09
да, был. но он обиделся на меня за мои комментарии к коду и удалил код.Dimon456 писал(а):А что целиком код был?