原理:f=1/t=1/10ms=100hz
需求:
1、测频率
2、测占空比(上升沿周期/周期)
一、cubeMX
配置
需要测占空比则再打开通道二配置channel->input capture indirect mode
再进行以下配置
二、Keil
main.c
void key_proc(void) //界面切换按钮
{
if(key[0].single_flag==1)
{
view=!view;
key[0].single_flag=0;
LCD_Clear(Black);
}
if(key[1].single_flag==1)//增加占空比
{
pa6_duty+=10;
if(pa6_duty>=100)pa6_duty=10;
__HAL_TIM_SetCompare(&htim16,TIM_CHANNEL_1,pa6_duty);
key[1].single_flag=0;
LCD_Clear(Black);
}
if(key[2].single_flag==1)
{
pa7_duty+=10;
if(pa7_duty>=100)pa7_duty=10;
__HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,pa7_duty);
key[2].single_flag=0;
LCD_Clear(Black);
}
}
void disp_proc(void) //界面切换
{
if(view==0)
{
char text[30];
// uint i=2;
sprintf(text," IC ");
LCD_DisplayStringLine(Line1, (unsigned char *)text);
sprintf(text," FRQ1:%d ",frq1);
LCD_DisplayStringLine(Line3, (unsigned char *)text);
sprintf(text," FRQ2:%d ",frq2);
LCD_DisplayStringLine(Line5, (unsigned char *)text);
}
if(view==1)
{
char text[30];
// uint i=20;
sprintf(text," Para ");
LCD_DisplayStringLine(Line1, (unsigned char *)text);
sprintf(text," PA6:%d ",pa6_duty);
LCD_DisplayStringLine(Line3, (unsigned char *)text);
sprintf(text," PA7:%d ",pa7_duty);
LCD_DisplayStringLine(Line5, (unsigned char *)text);
}
}
interrutp.c
uint16_t ccr1_val=0,ccr2_val=0;
uint8_t frq1=0,frq2=0;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM2)
{
ccr1_val=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);
__HAL_TIM_SetCounter(htim,0);
frq1=(8000000/80)/ccr1_val;
HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);
}
if(htim->Instance==TIM3)
{
ccr2_val=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);
__HAL_TIM_SetCounter(htim,0);
frq2=(8000000/80)/ccr1_val;
HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);
}
}