Jump to content

9Klima

Members
  • Content Count

    4
  • Joined

  • Last visited

Community Reputation

0 Обычный

About 9Klima

  • Rank
    Новенький

Информация

  • Город
    Kiev

Электроника

  • Стаж в электронике
    10-20 лет
  • Сфера радиоэлектроники
    Микроконтроллеры и авто электроника
  • Оборудование
    Много
  1. uint8_t GetPrescCntVal(double freq, uint16_t *PSCRmax, uint16_t *ARRmax) // freq - частота требуемая на ыходе, // *PSCRmax - указатель на переменную с максимумами принимаемых значений // *ARRmax - указатель на переменную с максимумами принимаемых значений { if(*ARRmax< 1)return 1; //ты забыл загрузить максимум if(*PSCRmax<1)return 2; //ты забыл загрузить максимум double temp1 =0; double temp2 =0; double temp4 =0; double temp3 =(double)CLK_GetClockFreq(); if(temp3<freq)return 3; //много хочешь я так не могу double temp4 =0; temp1 =(temp3/freq); if( ( (( modf(temp1,&temp2)*100)>=50) ? ((uint16_t)temp1+1) : ((uint16_t)temp1) ) <=*ARRmax ) //замысловатая конструкция для явно проверки остатка от деления на выход за максимум регистра [ARRх] { *PSCRmax =0; *ARRmax =(uint16_t)temp1; return 0; } else { temp3=1; //прирастим показатель степени двойки ([PSCR]) //так как раннее было выяснено что он явно больше 0 while((uint16_t)temp3<=*PSCRmax) //начинаем магию расчёта [PSCR] { temp4 = temp1/pow(2,temp3); if( ( (( modf(temp4,&temp2)*100)>=50) ? ((uint16_t)temp4+1) : ((uint16_t)temp4) ) <=*ARRmax ) //замысловатая конструкция для явно проверки остатка от деления на выход за максимум регистра [ARRх] { *PSCRmax =(uint16_t)temp3; *ARRmax =(uint16_t)temp4; return 0; } else temp3=temp3+1; //прирастим показатель степени двойки ([PSCR]) } } return 255; //чтото пошло не так } Навоял такую процедуру ложу для обсуждения и исправления дополнения (еще не проверял побежал по работе )
  2. Отписываюсь за успехом частичным начитал на форумах неправильный алгоритм расчёта, правильно нужно считать так: частота тактирования таймера вычисляется по формуле Fclk_tim=Fmaster/(2^(PSCK)) тогда: 16 000 000 / 2^6 = 16 000 000 / 64 =250 000. и дальше: 250 000 / 65536 = 3.81Hz тут еще один вопрос по расчёту двух неизвестных для регистров ARR и PSCR пока крутил вертел основательно запутался хочу процедуре скормить частоту тактирования и желаемую выходную а она мне что загрузить в регистры оптимальные значения. думаю что я это смогу решить но пока ступор сижу перебираю алгоритмы в голове. чувствую рекурсия пойдёт в дело но это не для контроллеров можно случайно сьесть память.
  3. Здравствуйте обитатели форума, вернулся к кодингу и на форум после лет 12 паузы. взялся за STM8 перед тем как штурмовть стм32 там уже получил по лбу когда-то и откотился. суть вопроса сконфигурировал второй таймер. второй канал на кристале STM8S103F3 как ШИМ1 всё класно работает гордость за не напрасно потраченное время на дробления RM0016. наступил момент написания библиотеки для удобности обращения с шимом и тут началась эпопея: Сначала как посчитать что загрузить чтобы получить желаемую частоту, потом проверка всё на осциллограммах и тут на меня приходит озарение что наверное что то не так, временные интервалы до частоты 122Hz рросчитываются и совпадают. А после просто треш : тактовая частота HSI 16 000 000 без делителей прямо на вход таймера. PSCR =0; ARR=65535; Fout=244Hz PSCR =1; ARR=65535; Fout=121Hz PSCR =2; ARR=65535; Fout=60Hz PSCR =3; ARR=65535; Fout=30Hz PSCR =4; ARR=65535; Fout=15Hz PSCR =5; ARR=65535; Fout=7,59Hz PSCR =6; ARR=65535; Fout=3,8Hz PSCR =7; ARR=65535; Fout=1,91Hz PSCR =8; ARR=65535; Fout=0,98Hz Вроде всё гармонично но по факту както у меня не сошлось с расчётами. Там где должно быть 80 там 60. Я понимаю что встроенный генератор не блещет стабтильностью но всё равно что-то с расчётами не так либо я вообще не знаю что делаю не так. Fout= Fтактирования/([PSCR]+1)/([ARR]+1) тз сих выходит: PSCR =8; ARR=65535; Fout=???Hz 16 000 0000/9/65536/=27Hz Что не так? где лыжи не едут? чувствую нужно срочно заказать частотомер для измерения до чёрто знаков дабы невроз не лечить.
×
×
  • Create New...