通用PWM捕获
gtim_timx_pwm_chy_init(5000 - 1,1700 - 1); /* 100k HZ计数频率,50ms的周期,占空比为50%,也就是高电平时间 = 25ms = 25000us */
ARR是5000-1,系统时钟频率170mhz,PWM频率=定时器时钟频率/(ARR+1)(PSC+1)=170mhz/(5000*1700)=20HZ,PWM周期=1/20=0.05s=50ms
占空比=比较值/(ARR+1)
捕获频率的计算:
计数频率=时钟频率/(ARR+1)
extern uint8_t g_timxchy_cap_sta; /* 输入捕获状态 */
extern uint16_t g_timxchy_cap_val; /* 输入捕获值 */int main(void)
{uint32_t temp = 0;uint8_t t = 0;HAL_Init(); /* 初始化HAL库 */sys_stm32_clock_init(85, 2, 2, 4, 8); /* 设置时钟,170Mhz */delay_init(170); /* 延时初始化 */usart_init(115200); /* 初始化串口 */led_init(); /* 初始化LED */gtim_timx_pwm_chy_init(5000 - 1,1700 - 1); /* 100k HZ计数频率,50ms的周期,占空比为50%,也就是高电平时间 = 25ms = 25000us */gtim_timx_cap_chy_init(0xFFFF - 1, 170 - 1); /* 以1Mhz的频率计数 捕获 *///0xFFFF:65534 这允许在较长的时间内进行捕获而不会溢出while (1){if (g_timxchy_cap_sta & 0X80) /* 成功捕获到了一次高电平 */{temp = g_timxchy_cap_sta & 0X3F;temp *= 0xFFFF; /* 溢出时间总和 */temp += g_timxchy_cap_val; /* 得到总的高电平时间 */printf("HIGH:%d us\r\n", temp); /* 打印总的高电平时间 */g_timxchy_cap_sta = 0; /* 开启下一次捕获 */}t++;if (t > 20) /* 200ms进入一次 */{t = 0;LED0_TOGGLE(); /* LED0闪烁,提示程序运行 */}delay_ms(10);}
}
&0x80 :检查左边第一位是否是1 ,它是1才可以进行if后的语句
至于为什么位7为1 就表示捕获成功的原因:
位0:捕获启动
位1:捕获溢出
位7:捕获成功
temp = g_timxchy_cap_sta & 0X3F :
0X3F:0011 1111
(uart:直接用printf 就可以)
溢出时间总和=溢出次数*溢出时间