新手入门
- 积分
- 17
- 金钱
- 17
- 注册时间
- 2018-4-24
- 在线时间
- 2 小时
|
5金钱
个人做一个基于STM32F103ZET6的心率检测系统的设计,传感器将周期为600-800ms的方波信号输入开发板,通过定时器3的上升沿输入捕获采集捕获到两个上升沿时计数器的值并作差计算频率,定时六秒测出平均频率并显示输出。
我改写的程序很不稳定,从0-1000多不等,偶尔可以测的正确值。求大神指教是哪里出了问题需要如何修改,以下是代码。
//定时器3通道1输入捕获配置
TIM_ICInitTypeDef TIM3_ICInitStructure;
void TIM3_Cap_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能引脚时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //PA6
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA6 输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_6); //PA6 下拉
//初始化TIM3
TIM_InternalClockConfig(TIM3);
TIM_TimeBaseStructure.TIM_Period = arr; //自动装载值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //预分频
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分割TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定参数初始化时间基数单位
//初始化输入捕获参数
TIM3_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01
TIM3_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿
TIM3_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1
TIM3_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //不分频
TIM3_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000不滤波¨
TIM_ICInit(TIM3, &TIM3_ICInitStructure);
//中断分组初始化
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure); //
TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新
TIM_Cmd(TIM3,ENABLE ); //
}
float FAN_Frequency=0;//频率
u16 TIM3CH1_CAPTURE_VAL1=0,TIM3CH1_CAPTURE_VAL2=0,CaptureNumber=0;//捕获值记录1、2、捕获次数
u32 TIM3Capture=0;//最终值
//定时器中断服务程序
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
{
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}
else if(TIM_GetITStatus(TIM3,TIM_IT_CC1)==SET)
{
TIM_ClearITPendingBit(TIM3,TIM_IT_CC1);
if(CaptureNumber==0)
{
TIM3CH1_CAPTURE_VAL1=TIM_GetCapture1(TIM3);
CaptureNumber=1;
}
else if(CaptureNumber==1)
{
TIM3CH1_CAPTURE_VAL2=TIM_GetCapture1(TIM3);
if(TIM3CH1_CAPTURE_VAL2>TIM3CH1_CAPTURE_VAL1)
{
TIM3Capture=(TIM3CH1_CAPTURE_VAL2-TIM3CH1_CAPTURE_VAL1);
}
else
{
TIM3Capture=((0xffff-TIM3CH1_CAPTURE_VAL1)+TIM3CH1_CAPTURE_VAL2);
}
CaptureNumber=0;
}
FAN_Frequency=(u32)1000000/(TIM3Capture);//频率
}
TIM_ClearFlag(TIM3, TIM_FLAG_CC1); //清除中断标志
}
部分主程序
int BPM; //心率值
void HeartRate(void);
extern float FAN_Frequency; //频率
extern u16 TIM3CH1_CAPTURE_VAL1,TIM3CH1_CAPTURE_VAL2,CaptureNumber; //捕获值记录1、2、次数
extern u32 TIM3Capture; //最终值
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
TIM3_Cap_Init(59999,71);
while(1)
{
HeartRate();
}
void HeartRate(void)
{
int i;
float j;
TIM_Cmd(TIM3,ENABLE);
for(i=1;i<=10;i++)
{
j+=FAN_Frequency;
_delay_ms(500);
}
TIM_Cmd(TIM3,DISABLE);
j=(j/10)*60;
BPM=j;
}
|
|