个人网站怎么自己备案,dw一个完整网页的代码,建设云个人服务平台登录入口,济南市病疾情最新信息一、概念介绍
输出比较#xff1a;
比较电路输入的CNT、CCR大小关系 #xff0c;在通道引脚输出高低电平 二、*频率知识、测量方法补充 * N/fc得到标准频率的时长#xff0c;也就是待测频率的周期
测频法代码实现#xff1a;修改对射式红外传感器计次#xff08;上升沿…一、概念介绍
输出比较
比较电路输入的CNT、CCR大小关系 在通道引脚输出高低电平 二、*频率知识、测量方法补充 * N/fc得到标准频率的时长也就是待测频率的周期
测频法代码实现修改对射式红外传感器计次上升沿计次、定时器外部时钟1s中断
测频法定时器中断并记录捕获次数测周法捕获中断并记录定时器次数。
三、输入捕获电路分析如何实现测周法 异或门其实还是为三相无刷电机服务三个霍尔传感器检测转子位置根据转子位置进行换相在前三个通道接上霍尔传感器这个定时器就作为无刷电机的接口定时器去驱动换相电路工作 输入滤波器避免毛刺 3.1设计成交叉状的目的
TI1FP1(TI1 Filter Polarity 1) --IC1--TI2FP1
TI1FP2--IC2--TI2FP2
1灵活切换后续捕获电路输入 CH1变成CH2 即一个通道切换两个引脚 2把一个引脚的输入同时映射到两个捕获单元PWMI模式经典结构 即两个捕获单元捕获一个引脚 举例
第一个捕获通道TI1FP1上升沿触发用来捕获周期
第二个捕获通道TI1FP2下降沿触发用来捕获占空比
两个通道同时对一个引脚进行捕获
3.2预分频器测周法实现捕获中断 *设置上升沿触发分频后的触发信号每来一次CNT就会向CCR转运一次又因为CNT是内部的标准时钟驱动的CNT数值就可以记录两个上升沿之间的时间间隔也就是周期取倒数得到频率
上升沿用于触发输入捕获CNT用于计数计时
捕获中断同时产生捕获事件这个事件在状态寄存器置标志位同时也可以产生中断
3.3应用场景超声波模块检测电路
3.4细节问题
每次捕获后把CNT清零这样下次上升沿再捕获取出的CNT 才是两个上升沿的时间间隔
用主从触发模式自动完成
四、电路执行细节 注意
CNT的值是有上限的65535ARRmax若信号频率太低CNT计数值会溢出 从模式的触发源选择TI1FP1 TI2FP2没有3,4 想用从模式自动清零CNT,只能用通道1和通道2对于通道3和通道4只能开启捕获中断手动清零
--Q:能否外部中断 AS:概念不清外部中断那是CPU了啊这里是硬件映射主模式然后配置从模式 也可以捕获第二个引脚TI2FP1 TI2FP2
五、函数学习 /*****初始化输入捕获单元******/
void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);//只配置一个通道void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);//配置两个通道PWMI模式/*****给输入捕获结构体赋初值*****/
void TIM_ICStructInit(TIM_ICInitTypeDef* TIM_ICInitStruct);*****************************选择从模式*********************************/*****选择从模式输入触发源*****/void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);
/*****选择主模式输出触发源*****/
void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource);
/*****选择从模式*****/
void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode);/*****配置分频器*****/
结构体里也能配置一个效果void TIM_SetIC1Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
void TIM_SetIC2Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
void TIM_SetIC3Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
void TIM_SetIC4Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);/*****读取CRR*****/
输入捕获模式下只读输出比较只写TIM_SetComparex函数是不一样的
uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture2(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture3(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture4(TIM_TypeDef* TIMx);
QAnS
为什么ARR要大一些
--防止N过大计数溢出为了防止cnt到了某个值就重装了
psc也不能给的太小防止测量的信号频率过低导致计数器溢出
注意
1.滤波器 VS分频器
滤波器计次不会改变信号原有频率因为滤波器采样频率远远高于信号频率只会滤除高频噪声使信号更平滑
分频器对信号本身计次会改变频率
这里用上升沿触发归零后边用下降沿不触发归零两个值一减就是占空比。归零一次是一个周期从0开始计高电平方便得出占空比不然还得用1再减一下
2.Fc 72MHz/(psc1) 六、输入捕获模式测频率代码分析 main.c
为什么PWM那里还是 720-1 IC却要改72-1
#include stm32f10x.h // Device header
#include Delay.h
#include OLED.h
#include PWM.h
#include IC.hint main(void)
{OLED_Init();PWM_Init();IC_Init();OLED_ShowString(1,1,Freq:00000Hz);PWM_SetPreScaler(720-1); //Freq 72M / (PSC1) / 100PWM_SetCompare1(50); //Duty CRR / 100while(1){OLED_ShowNum(1,6,IC_GetFreq(),5);}}IC.C
#include stm32f10x.h // Device headervoid IC_Init(void)
{/*****STEP1 开启时钟*****/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//TIM2要输出PWM 换成3捕获RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//TIM3_CH1 在PA6口/*****STEP2 配置GPIO*****/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_ModeGPIO_Mode_IPU; GPIO_InitStructure.GPIO_PinGPIO_Pin_6;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStructure);/*****STEP3 配置时基单元*****/ TIM_InternalClockConfig(TIM3);TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up ;TIM_TimeBaseInitStructure.TIM_Period 65536 - 1;//ARRTIM_TimeBaseInitStructure.TIM_Prescaler 72 - 1 ;//PSC 1MHzTIM_TimeBaseInitStructure.TIM_RepetitionCounter 0;TIM_TimeBaseInit(TIM3,TIM_TimeBaseInitStructure);/*****STEP 4 输入捕获配置*****/TIM_ICInitTypeDef TIM_ICInitStructure;TIM_ICInitStructure.TIM_Channel TIM_Channel_1; //选择通道TIM_ICInitStructure.TIM_ICFilter 0xF; //配置滤波器参数数值越大过滤效果越好TIM_ICInitStructure.TIM_ICPolarity TIM_ICPolarity_Rising; //极性选择TIM_ICInitStructure.TIM_ICPrescaler TIM_ICPSC_DIV1; //分频器TIM_ICInitStructure.TIM_ICSelection TIM_ICSelection_DirectTI; //配置数据选择器TIM_ICInit(TIM3,TIM_ICInitStructure);/*****STEP 5 配置主从触发模式 *****/TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1); //触发源选择TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset); //配置从模式/*****STEP6 启动定时器*****/TIM_Cmd(TIM3,ENABLE);
}uint32_t IC_GetFreq(void)
{return 1000000 / TIM_GetCapture1(TIM3); //Fc 72MHz/(psc1)
}现象
10001Hz
原因
计数到1000Hz那个数信号刚好跳变导致数没记上
有朋友说是因为读取的是N但实际上计了N1个数因为计数器CNT是从0开始计的所以这里要加一错自行探讨
改进
uint32_t IC_GetFreq(void) { return 1000000 / TIM_GetCapture1(TIM3)1; //Fc 72MHz/(psc1) }
七、PWMI测占空比代码分析 与上一个代码不同的地方
1.输入捕获初始化需要升级
两个通达捕获同一个引脚比较朴素的想法就是再定义一遍结构体参数
通道1 直连输入上升沿触发 通道2 交叉输入通道2相当于通道1 的交叉输入结果下降沿触发
TIM_ICInitStructure.TIM_Channel TIM_Channel_2; //选择通道TIM_ICInitStructure.TIM_ICFilter 0xF; //配置滤波器参数数值越大过滤效果越好TIM_ICInitStructure.TIM_ICPolarity TIM_ICPolarity_Falling; //极性选择TIM_ICInitStructure.TIM_ICPrescaler TIM_ICPSC_DIV1; //分频器TIM_ICInitStructure.TIM_ICSelection TIM_ICSelection_IndirectTI; //配置数据选择器TIM_ICInit(TIM3,TIM_ICInitStructure);
简单的办法 只支持通道1、2之间 TIM_PWMIConfig(TIM3,TIM_ICInitStructure); //自动把剩下的通道配置成相反的配置2.占空比函数
uint32_t IC_GetDuty(void)
{return (TIM_GetCapture2(TIM3) 1) * 100 /(TIM_GetCapture1(TIM3) 1);
}3.main变动
/***main 变动***/
OLED_ShowString(2,1,Duty:00%);/***while 变动***/
OLED_ShowNum(2,6,IC_GetDuty(),2);
八、探究测频率性能
测频率范围
fc 1MHz Nmax 65535 最低频率是15Hz左右
要是再想降最低频率限制PSC加大这里fc72M/(PSC1)就是1M当fc越小能够测量的信号频率就越小所以你要想测频率更小的信号就可以减小fc,也就是增大PSC值
频率上限就是标准频率了再高没法测误差正负一误差1/计数值大提高上限就要降低PSC或者尝试测频法