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

Re: Нестабильность из-за задержек

Пн апр 26, 2021 16:41:56

да, я это знаю :) собственно поэтому тот первый таймер и не делал с точностью до такта... а сейчас больше теоретические замашки...
думаю, что 20кГц на выходе смогу достичь...

Re: Нестабильность из-за задержек

Пн апр 26, 2021 17:15:08

Reflector писал(а):А ничего что у встроенного генератора tiny13 точность ±2% после калибровки?
точность внутреннего генератора тут совершенно ни при чем - всегда можно поставить внешний кварц.

Re: Нестабильность из-за задержек

Пн апр 26, 2021 17:21:22

Reflector, Да они тут с джиттером воюют. DS18B20 тоже выдаёт 00625 градуса, а на деле плюс-минус лапоть.

Re: Нестабильность из-за задержек

Пн апр 26, 2021 18:06:47

точность внутреннего генератора тут совершенно ни при чем - всегда можно поставить внешний кварц.

До того как написать, что tiny13 по-прежнему достаточно Ivanoff-iv также говорил, что будет в эту тиньку утрамбовываться код... Зачем его утрамбовывать, если не собираешься делать именно на ней? В протеусе смысла выбирать тиньку вообще никакого, если же собирать в реальном железе, то кварц не поставишь, а без него любая попытка измерений генерируемого сигнала будет упираться в нестабильный встроенный генератор...

Re: Нестабильность из-за задержек

Пн апр 26, 2021 18:26:42

Ivanoff-iv писал(а):Где такое :shock: как увидеть?
Вот
СпойлерИзображение
Измерьте желтый участок
Пример
СпойлерИзображение
Частота МК 16МГц (точное значение 16252928 Гц)
Частота сигнала 7981 Гц
Частота прерывания таймера 262144 Гц
Расчетный джиттер 1/262144 = 3,81 мкс, 1 прерывание таймера
В данном примере используется 24 битный сумматор, шаг (шаг сумматора) перестройки 0,015625 Гц

Еще раз хочу напомнить NCO-модуль в PIC качается от 16МГц, а AD9833 от 25МГц.
На stm32f030 (тактовая 72МГц) мне удалось выжать 3МГц (частота прерывания таймера).

Для сравнения, разгоняем протеус
ИзображениеЧастота МК 520МГц (точное значение 520093696 Гц)
Частота сигнала та же, 7981 Гц
Частота прерывания таймера 8388608 Гц (чуть больше 8 МГц)
Расчетный джиттер 1/8388608 = 0,12 мкс, 1 прерывание таймера
В данном примере используется 24 битный сумматор, шаг (шаг сумматора) перестройки 0,5 Гц

Рисунки gif, анимация.

Re: Нестабильность из-за задержек

Пн апр 26, 2021 19:25:13

Ээээ, меня за усы тянуть не надо! что такое джиттер я в курсе
у меня где ты такой джиттер нашел?

Добавлено after 1 minute 43 seconds:
тини13 - психологическая граница :)
код не взорвётся, нсли я его в другой проект утяну...

Re: Нестабильность из-за задержек

Пн апр 26, 2021 19:43:50

Ivanoff-iv писал(а):у меня где ты такой джиттер нашел?
СпойлерИзображение
Без комментариев.

Re: Нестабильность из-за задержек

Пн апр 26, 2021 20:29:09

а там кнопка настройки частоты не нажата?

Re: Нестабильность из-за задержек

Вт апр 27, 2021 06:15:42

Ivanoff-iv, я изначально говорил, что это делитель
СпойлерИзображениес ростом частоты растет погрешность
мало того еще и господину Reflector говорил - заставьте таймер в stm32 работать в режиме сумматора.
Ivanoff-iv, я могу синтезировать частоту
СпойлерЧастота МК 16МГц (точное значение 16252928 Гц)
Частота сигнала 7981 Гц
Частота прерывания таймера 262144 Гц
Расчетный джиттер 1/262144 = 3,81 мкс, 1 прерывание таймера
В данном примере используется 24 битный сумматор, шаг (шаг сумматора) перестройки 0,015625 Гц
от 0,015625 Гц до 131072 Гц с шагом 0,015625 Гц на всем протяжении диапазона.
Помимо того еще и не только с генерировать синус но и любой другой сигнал (пилообразный, треугольный, пользовательский).

Re: Нестабильность из-за задержек

Вт апр 27, 2021 07:32:20

Да, соглашусь, это хоть и не простейший, но делитель... сейчас его переделываю... на С желаемых характеристик добиться не смог, не хочет содержимое прерывания гарантированно укладываться в 128 тактов МК... хотя там одно условие, одно суммирование и одно присвоение... (я знаю почему оно не влазит... можно не объяснять).
по синтезу частоты: у МК остается время на что-то ещё?

Re: Нестабильность из-за задержек

Вт апр 27, 2021 08:53:50

Ivanoff-iv писал(а):я знаю почему оно не влазит
да все там влазит, даже 20кГц вытягивает.
Reflector хотел что бы я его от 72Мгц кочегарнул, вот кочегарнул, пусть смотрит
СпойлерИзображение
СпойлерТестовый код Атмега168 Тактовая МК 16 МГц
Код:
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <util/delay.h>

#define Fclk 16000000UL

#define Out() (PINB=(1<<0))            //переключение ножки
       unsigned int  Frq=10;           //текущая частота

register uint16_t  Tim asm("r6");   // r6 r7
register uint8_t  Ost asm("r8");   //  r8

register uint16_t  countS asm("r10");   // r10 r11

unsigned long int  tTim;//=12000000/Frq;  //вычисляем период
unsigned char tOst;//=tTim;               //последний байт (до256)

void Calc(void)                        //вычисляем период и довесок
{
tTim=8000000UL/Frq;
tOst=tTim;
tOst>>=1;                              //делим на 2
tOst|=0x80;                            //прибавим 128 (вычисляем довесок)
//у нас 2 довеска - сумма их как-раз и получится 1 полный оборот и остаток (но их пришлось делить на 2 т.к. трудно обработать 2 близко стоящих прерывания)
tTim>>=8;                              //делим период на 256
cli();
Tim=tTim;                              //выводим в буфера
Ost=tOst;
sei();
};

ISR(TIMER2_COMPA_vect)   // Шаг 0,0625 us
{   
if (countS) {countS--;}
else
  {
  countS=Tim;                          //взводим таймер обратно
  Out();                               //работаем работу
  };
  OCR2A=(countS<2)? Ost:0xff;          //выбираем скорость таймера

}

int main()
 {
   // Write your code here
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=Out Bit0=Out
DDRB=(1<<DDB7) | (1<<DDB6) | (1<<DDB5) | (1<<DDB4) | (1<<DDB3) | (1<<DDB2) | (1<<DDB1) | (1<<DDB0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=0 Bit0=0
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 16000,000 kHz
// Mode: CTC top=OCR2A
// OC2A output: Disconnected
// OC2B output: Disconnected
// Timer Period: 0,0625 us
ASSR=(0<<EXCLK) | (0<<AS2);
TCCR2A=(0<<COM2A1) | (0<<COM2A0) | (0<<COM2B1) | (0<<COM2B0) | (1<<WGM21) | (0<<WGM20);
TCCR2B=(0<<WGM22) | (0<<CS22) | (0<<CS21) | (1<<CS20);
TCNT2=0x00;
OCR2A=0x00;
OCR2B=0x00;


// Timer/Counter 2 Interrupt(s) initialization
TIMSK2=(0<<OCIE2B) | (1<<OCIE2A) | (0<<TOIE2);

sei();

Frq=10060;
Calc();

while (1)
      {
      }
 }
Как это был делитель так он и остался делителем.
Усе. Точка на этом.
Ответить