单片机STM32F103C8T6实现数字频率计
时间: 2024-04-25 21:03:38 浏览: 210
stm32的单片机的数字频率计设计.rar
5星 · 资源好评率100%
实现数字频率计的一般步骤如下:
1. 选取一个合适的计数器:一般情况下,选择一个计数器能够满足测量的最高频率的10倍以上即可。在STM32F103C8T6中,TIM2、TIM3、TIM4和TIM5都是16位计数器,最大计数值为65535。
2. 配置计数器的输入时钟:计数器的时钟源可以选择内部时钟或者外部时钟,可以通过设置TIMx_SMCR(x为计数器编号)寄存器来选择输入时钟源,并设置计数器的计数模式。
3. 配置计数器的计数模式:可以选择向上计数、向下计数或者向上/向下计数模式。
4. 配置计数器溢出中断:当计数器达到最大值时会触发溢出中断,可以通过TIMx_SR(x为计数器编号)寄存器中的UIF位来判断是否发生了溢出中断,并在中断处理函数中进行相应的处理。
5. 计算测量的频率:当计数器进行计数时,可以通过计算计数器的计数值和计数器的输入时钟频率来计算测量的频率。
6. 输出测量结果:可以通过串口、LCD等方式将测量结果输出。
以下是一个简单的数字频率计的程序示例:
```c
#include "stm32f10x.h"
#include "stdio.h"
#define TIMER_CLOCK_FREQ 72000000
uint16_t cnt_value = 0;
float freq = 0;
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
cnt_value = TIM_GetCounter(TIM2);
freq = (float)TIMER_CLOCK_FREQ / (float)cnt_value;
}
}
int main(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
// 使能TIM2时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
// 使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 配置PA0为TIM2的CH1输入口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// TIM2配置
TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
// 选择TIM2的CH1作为输入
TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1);
// 选择计数模式为向上计数
TIM_Cmd(TIM2, ENABLE);
// 配置TIM2溢出中断
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
while(1)
{
printf("Freq = %.2f Hz\r\n", freq);
delay_ms(1000);
}
}
```
在上述程序中,使用TIM2作为计数器,通过PA0作为TIM2的CH1输入口,来接收外部信号。在中断处理函数中,计算计数器的计数值和计数器的输入时钟频率,得到测量的频率。最后通过串口将测量结果输出。
阅读全文