1.硬件原理
通过PA0端口产生输出PWM波形,PA6口输入频率从而达到捕获的目的
2.输出PWM波形部分思路:
PA0产生输出PWM波形
其中我们用通用定时器,所以我们选择是TIM2,也就是通用定时器2
a.通过定时器2通道产生
其中通用定时器2,3,4,5都在同一个APB2总线上
a.所以使能定时器2和GPIOA
b.初始化GPIOA
c.配置时钟源和时基单元初始化
d.PA0输出比较初始化
e.使能定时器
f.控制PWM频率大小
3.输出波形部分代码
1.受外设控制的引脚,均需要配置为复用模式,并且输出,所以PA_0模式要设置成推挽输出模式
2.因为是内部输出,要把TIM2配置成内部时钟
3.因为
(ARR+1)一更改影响三个参数所以不该ARR,频率该PSC+1,占空比更改CCR
4.因为结构体值没赋完所以通过TIM_OCStructInit先给所有结构体内的值赋一个初始值,然后对其内部的一些值进行更改
输出比较配置成PWM模式1,输出为高电平,输出使能打开,初始CCR设为0,
5.使能定时器
6.
TIM_PrescalerConfig:设置PSC的值
the update event:更新事件重装
immediately:立刻重装
TIM_SetCompare1:设置CCR1的值
比如:
PA口就能输出一个频率1KHz,占空比50%的待测信号
4.输入捕获代码
1.RCC开启时钟:开启GPIO和TIM时钟
2.GPIO初始化:把GPIO设置成输入模式一般为上拉输入和浮空输入(容易受影响)
3.配置时基单元:用于自增
4.配置输入捕获模块:配置滤波器、极性、分频器、直连通道还是交叉通道
5.从模式触发源选择:这里选择为TI1FP1
6.触发源触发操作选择:执行reset(复位)操作
7.使能TIM3,使其运行
8.库函数
TIM.h库函数
TIM_ICInit:
结构体配置输入捕获单元函数,输入捕获和输出比较都有四个通道,输入捕获因为可能有交叉通道存在所以没有用OCInit一样有四个通道配置函数
第一个参数选择哪个定时器,第二个参数就是包含各个配置的结构体第一个参数选择哪个定时器,第二个参数就是包含各个配置的结构体
TIM_PWMIConfig:如果用ICinit的话只能配置一路,但是用TIM_PWMIConfig两路可以同时配置
这个函数将外设电路一次性配置成PWMI模式(通过这个函数配置能把另一个通道配置成相反的函数)在这个整体中,他配置为通道2,交叉,下降沿触发
TIM_SelectInputTrigger:选择输入触发源TRGI(从模式触发源选择)
调用这个函数就能选择从模式的触发源了。我们本节要用的TI1FP1
TIM_SelectSlaveMode:选择从模式响应功能
TIM_SelectOutputTrigger:选择输出触发源TRGO(主模式输出触发源选择)
读写的都是CCR寄存器。
输出比较模式下,CCR是只写的,要用TIM_SetCompare1写入。
输入捕获模式下,CCR是只读的,要用TIM_GetCapture1读出
输入捕获代码实现
第一步开启RCC时钟:
因为TIM2输出PWM。所以输入捕获的定时器要换一个,所以我们用TIM3。TIM3也是APB1的外设,所以函数还是APB1
由上图可以看到TIM3的通道1和通道2对应PA6和PA7。通道3和通道4对应PB0和PB1,因为我们本次代码计划用TIM3的通道1引脚,所以引脚就是PA6。
我们计划用PA6的TIM3_CH1通道,所以开启GPIOA的时钟。
所以我们开启RCC时钟为:
第二步GPIO初始化:上拉输入,GPIOA_6
第三步时基单元配置
接下来就是时基单元,选择内部时钟,定时器要换成TIM3。
然后是时基单元的参数,ARR自动重装值,为防止计数溢出。这里我们就给最大值65536-1,也就是十六位的计数,可以满量程计数。因为更新频率=72M/PSC+1/ARR+1,
fc(标准)=72M/PSC+1
fx=fc/N
arr越大N的范围就越大,从而使其计数越界的范围越小
由于我们要配置PA6所以我们选择TIM3通道1
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
直连的话是TI1FP1
交叉的话是TI1FP2
由于不是直连,交叉就是ch2数据选择器是由ch1捕获的了
TIM_PWMIConfig()
使用这个函数,只需要传入一个通道的参数就行了,在这个函数里会自动把剩下的一个通道初始化成相反的配置
比如这里传入通道1,直连,上升沿,那函数里面就会顺带配置通道2,交叉,下降沿。
如果传入通道2,直连,上升沿,函数就会顺带配置通道1,交叉,下降沿。
这个函数只支持通道1和通道2的配置,不要传入通道3和通道4。