芯片:STM32F407ZGT6
我想用定时器输入捕获来测量输入信号的频率和占空比,但是在输入信号峰峰值低于一定值之后测量就不准确了?
有人知道这是什么原因吗?如果我想测量的范围为0-3V,有什么办法可以解决吗(用输入捕获)?
#include "stm32f4xx.h"
#include "delay.h"
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;//LED
NVIC_InitTypeDef NVIC_InitStructure;//NVIC
TIM_TimeBaseInitTypeDef TIM_InitStructure;
//使能定时器 及TIM3 外设时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);//ʹĜGPIOCʱ֓ 外设时钟使能
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//使能 定时器时钟TIM3
//设置TIM3_DIER允许更新中断
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//参数2:指明使能的定时器中断类型 更新(该项目为更新)、触发、输入捕获
//LED 初始化 仅需设置前两个参数即可,后面三个均为默认
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Low_Speed;
GPIO_Init(GPIOC , &GPIO_InitStructure);
//定时器初始化 通用定时器 四个参数即可
// TIM_InitStructure.TIM_Prescaler = 8400-1;//分频系数 500ms
TIM_InitStructure.TIM_Prescaler = 16800-1;//分频系数 用于对比 1000ms
TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
TIM_InitStructure.TIM_Period = 5000-1;//自动重载计数周期值
TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//时钟分频因子
TIM_TimeBaseInit(TIM3, &TIM_InitStructure);
//中断优先级设计
//配置中断分组NVIC
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;//定义的初始化中断
// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM3,ENABLE);//使能TIM3
//设置LED灯初始化熄灭 置高位
GPIO_SetBits(GPIOC, GPIO_Pin_13);//灯不亮
while(1);
}
//6、编写中断服务函数
//判断溢出中断是否发生
//清除某中断线的中断标志位
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)//计数上溢
{
if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)==1)//灯不亮
{
GPIO_ResetBits(GPIOC, GPIO_Pin_13);//灯亮
}
else
{
GPIO_SetBits(GPIOC, GPIO_Pin_13);//灯不亮
}
}
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除中断标志位
}
时间20221031
友友们,后续我要开始利用定时器通过串口发送数据给上位机啦!