Но вот настроить таймер на работу как обычный частотомер немогу ((((
Помогите решить поставленную задачку.
Есть сигнал частота его от 0,00Гц до 1600,00Гц нужно его вычислить и записать в переменную пределы которой 0х0000 до 0х0Е10
Или второй сигнал его частота от 0,00Гц до 400,00Гц который нужно записать в переменную с пределами 0х0000 до 0х1F40
Оба сигнала чистый меандр.
STM32 тактируется от внешнего кварца частотой 16МГц
SYSCLK=72МГц
HCLK=72МГц
PCCLK1/PCCLK2=36МГц
APB1P/APB2P=36МГц
В итоге на таймерах у меня тактовая частота = 72МГц
Попытался реализовать счет на таймере TIM6 с работой по внешнему прерыванию. Считает не корректно и значение обратно пропорционально получается (при махf - 0х0000 при minf - 0xFFFF) Вот код:
Спойлер
Код: Выделить всё
#include "st.h"
#include "hw_config.h"
#define OCCUPIED 0xFC
#define FREE 0
#define SET 0xEE
float K_div = 1; // коэфициент деления частоты
unsigned char Int_Market;
uint16_t Result, Int_period_time;
unsigned int temp;
uint16_t dobavka =0;
uint16_t temp1;
uint16_t temp2;
unsigned char ex; //dobavka = 0x14FC ex = 0xFC ex2 = 0x14
unsigned char ex2;
//-------------------------------------------------------------------------------------------------------
// расчет и преобразование сигнала
//--------------------------------------
//Обработка внешнего прерывания на PA10
//--------------------------------------
void EXTI15_10_IRQHandler(void)
{
/* нужно проверять состояние линии прерывания */
if (EXTI_GetITStatus(EXTI_Line10) != RESET) {
EXTI_ClearITPendingBit(EXTI_Line10); // сбрасываем флаг прерывания
switch (Int_Market) {
case FREE:
Int_period_time = TIM_GetCounter(TIM6);
TIM_SetCounter(TIM6, 0xCCCC);
Int_Market=SET;
break;
}
}
}
void Measurement(void)
{
Result =(unsigned int)(((unsigned long)(Int_period_time/K_div )+1) >>1);
Int_Market=FREE;
}
void Basis_cycle(void)
{
if (Int_Market == SET)
{
Measurement(); //вычисляем период входного импульса
dobavka = Result;
convert(dobavka);
}
}
//--------------------------------------
//// Настроим таимер для подсчета импульсов входящей скорости
//--------------------------------------
void Speed_init (void)
{
TIM_TimeBaseInitTypeDef TIM_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
TIM_TimeBaseStructInit(&TIM_InitStructure);
TIM_InitStructure.TIM_Prescaler=65535-1;
TIM_InitStructure.TIM_Period=0xFFFF;
TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Down;
TIM_TimeBaseInit(TIM6,&TIM_InitStructure);
TIM_Cmd(TIM6,ENABLE);
NVIC_EnableIRQ(TIM6_IRQn);
TIM_Cmd(TIM6, ENABLE);
}
//--------------------------------------
//Конвертация результата из 16 в два по 8
//--------------------------------------
void convert(uint16_t dobavka){
for(x=0;x<8;x++){
temp1=dobavka;
temp1=temp1>>8;
temp1=temp1>>x;
temp1&=~0xFFFE;
switch(temp1){
case 0: ex2=ex2>>1; ex2&=~0x80; break;
case 1: ex2=ex2>>1; ex2|=0x80; break;
default:break; }
}
x=0;
for(x=0;x<8;x++){
temp2=dobavka;
temp2=temp2>>x;
temp2&=~0xFFFE;
switch(temp2){
case 0: ex=ex>>1; ex&=~0x80; break;
case 1: ex=ex>>1; ex|=0x80; break;
default:break; }
}
x=0;
}

