说在前面
今天10.1号 看了看日期 学了快10天
给自己安排了下面的学习内容
准备去学学剩下的ADC I2C SPI WDG 感觉就差不多了
单一定时器 是没有 输入输出两个功能不能同时启用
输入捕获
评测方法-测周法
N 是这个标准频率内计数的次数
其中N有可能没有记一个完整的次数 导致一定的误差
主从模式(手册没这个东西)
主模式 可以将定时器内部的信号,映射到TRGO引脚 用于触发别的外设
从模式 就是接收其他外设或者自身外设的一些信号 用于控制自身定时器的运行,也就是被别的信号控制
触发源选择 就是选择从模式的触发信号源的
其中在这次实验中 使用TI1FP1 和TI2FP2 这两个触发方式
时基单元
标准频率 = 72M / psc +1
ARR 建议设置最大值 65535
输入捕获基础结构
其中 只使用一个通道 所以只能捕获频率
从头到尾 先3后4 其中 3将结果保存后 从模式在进行
GPIO输入方波信号
滤波器 一般来说越大越好 参考手册
边沿检测 上升沿检测
输入通道选择直连
分频器不分频
TI1FP1 出现上升沿时 CNT的值 转运到 CCR1中
触发沿触发上升沿信号
- 从模式选择reset
- 将cnt计数器清零
PWMI 输出结构
主要讲下面的TI2FP2 是什么原理
下降沿触发
交叉通道输入
不分频
CCR2 记下CNT的值
不参与CNT清零
当记下CCR1 捕获的整个周期的cnt值的时候
通过ccr2/ccr1 就能捕获占空比
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| #include "stm32f10x.h"
void ic_init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); GPIO_InitTypeDef gpioA_struct; gpioA_struct.GPIO_Mode = GPIO_Mode_IPU; gpioA_struct.GPIO_Pin = GPIO_Pin_6; gpioA_struct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &gpioA_struct); TIM_InternalClockConfig(TIM3); TIM_TimeBaseInitTypeDef TIM_InitStruct; TIM_InitStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_InitStruct.TIM_Period = 65536 - 1 ; TIM_InitStruct.TIM_Prescaler = 72 - 1; TIM_InitStruct.TIM_RepetitionCounter = 0x0000; TIM_TimeBaseInit(TIM3, &TIM_InitStruct); TIM_ClearFlag(TIM3, TIM_FLAG_Update); TIM_ICInitTypeDef TIM_ICinitStruct; TIM_ICStructInit(&TIM_ICinitStruct); TIM_ICinitStruct.TIM_Channel = TIM_Channel_1; TIM_ICinitStruct.TIM_ICFilter = 0xF; TIM_ICinitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICinitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICinitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_PWMIConfig(TIM3, &TIM_ICinitStruct); TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1); TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset); TIM_Cmd(TIM3,ENABLE);
}
uint32_t IC_GetFreq(void) { return 1000000 / (TIM_GetCapture1(TIM3) + 1); }
uint32_t IC_GetDuty(void) { return (TIM_GetCapture2(TIM3)+1)*100 / (TIM_GetCapture1(TIM3)+1); }
|