当前位置: 首页 > news >正文

龙华做棋牌网站建设哪家好/上海短视频seo优化网站

龙华做棋牌网站建设哪家好,上海短视频seo优化网站,校园宿舍网网络设计案例,做水果为主的b2c网站有哪些资料来着江协科技 这篇是编码器测速,江科大的源码在测速的时候,定时器TIM2是一直在跑的,不受其它控的,它就一直隔1S读一次CNT的值。它也不管是否有输入信号。源码程序修改一下是可以实现对PWM信号以测频法的方式读取。 笔者稍微改…

资料来着江协科技

       这篇是编码器测速,江科大的源码在测速的时候,定时器TIM2是一直在跑的,不受其它控的,它就一直隔1S读一次CNT的值。它也不管是否有输入信号。源码程序修改一下是可以实现对PWM信号以测频法的方式读取。

       笔者稍微改了一下这源码程序,让TIM3有信号输入时,TIM2才开始工作计数。源码在读连续信号的时候还是好用的,在读离散信号的时候可能就不怎么好用了。

比如我希望在某个IO口检测到一段1KHZ的频率的方波(或几次计数),方波的持续时间达到300ms,就开启某个功能,源码这个方案就不太好用,因此稍微修改了下程序。让其也满足这个条件

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"
#include "Encoder.h"
#include "LED.h"int16_t Num;			//定义在定时器中断里自增的变量
uint16_t i = 0;         //中断次数指示,TIM2是1S中断int main(void)
{/*模块初始化*/OLED_Init();		//OLED初始化Timer_Init();		//定时中断初始化Encoder_Init();// LED_Init();/*显示静态字符串*/OLED_ShowString(1, 1, "CNT:");			//1行1列显示字符串Num:while (1){if(Num != 0)OLED_ShowSignedNum(1, 5, Num, 5);			//不断刷新显示Num变量}
}/*** 函    数:TIM2中断函数* 参    数:无* 返 回 值:无* 注意事项:此函数为中断函数,无需调用,中断触发后自动执行*           函数名为预留的指定名称,可以从启动文件复制*           请确保函数名正确,不能有任何差异,否则中断函数将不能进入*/
void TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)		//判断是否是TIM2的更新事件触发的中断{Num = TIM3_GetNumber();                                  //TIM3的CNT值赋值给Num,该值在1s中断中        TIM_SetCounter( TIM3, 0);                               //TIM3的CNT清零    TIM_Cmd(TIM2, DISABLE);                                 //关闭TIM2定时器TIM_SetCounter( TIM2, 0);                               //TIM2 CNT计数清0   TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);                 //使能TM3捕获中断    TIM_ClearITPendingBit(TIM2, TIM_IT_Update);             //清除TIM2更新事件的中断标志位}
}

Encoder.c

#include "stm32f10x.h"                  // Device headervoid Encoder_Init(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);    //开启TIM3外设时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);   //开启GPIOA外设时钟GPIO_InitTypeDef GPIO_InitStruct;                   //GPIO功能设置GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU ;GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz ;GPIO_Init( GPIOA, &GPIO_InitStruct);TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;   //时基单元设置TIM_TimeBaseInitStruct.TIM_ClockDivision  = TIM_CKD_DIV1 ;//该处设置对于目前的程序信号好像不起作用,最起码结果上不起作用因此默认为不分频TIM_TimeBaseInitStruct.TIM_CounterMode  = TIM_CounterMode_Up  ;TIM_TimeBaseInitStruct.TIM_Period  = 65536-1  ;  //ARRTIM_TimeBaseInitStruct.TIM_Prescaler  = 1-1 ;   //Psc,设置为不分频即1个触发信号触发一次TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);TIM_ICInitTypeDef   TIM_ICInitStruct;          //信号输入捕获设置,设置了两个通道TIM_ICStructInit(&TIM_ICInitStruct);TIM_ICInitStruct.TIM_Channel = TIM_Channel_1  ;TIM_ICInitStruct.TIM_ICFilter = 0x0F ;TIM_ICInit(TIM3,  &TIM_ICInitStruct);TIM_ICInitStruct.TIM_Channel = TIM_Channel_2  ;TIM_ICInitStruct.TIM_ICFilter = 0x0F ;TIM_ICInit(TIM3,  &TIM_ICInitStruct);TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, //编码器设置TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);  //TM3捕获1中断使能// 配置TIM3中断NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;        //响应优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);TIM_Cmd( TIM3, ENABLE);   //时钟使能}uint16_t TIM3_GetNumber(void)
{return TIM_GetCounter(TIM3);}void TIM3_IRQHandler(void)
{if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET){             TIM_Cmd(TIM2, ENABLE);  // 使能TIM2定时器                   TIM_ClearITPendingBit(TIM3, TIM_IT_CC1); // 清除中断标志TIM_ITConfig(TIM3, TIM_IT_CC1, DISABLE);//TIM3关闭捕获中断}
}

修改后的代码功能:

       TIM3通道1检测到输入捕获的时候会进入中断使能定时器2,定时器2开始计时,当定时器2溢出时进入定时器2的中断读取TIM3 CNT里的值并且清0,(显然如果TIM3的输入信号频率过快的话会产生一点延时)并关闭定时器2,使能定时器3捕获中断,退出TIM2中断如果编码器还在转动又会马上进入TIM3捕获中断开启定时器2,让其再开启定时功能。


      以此为基础重写了之前的测频法程序。

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"
#include "ICfeq.h"uint16_t Num;			//定义在定时器中断里自增的变量
uint16_t i = 0;         //中断次数指示,TIM2是1S中断int main(void)
{/*模块初始化*/OLED_Init();		//OLED初始化Timer_Init();		//定时中断初始化IC_Init();/*显示静态字符串*/OLED_ShowString(1, 1, "CNT:");			//1行1列显示字符串Num:while (1){if(Num != 0)OLED_ShowNum(1, 5, Num, 5);			//不断刷新显示Num变量}
}/*** 函    数:TIM2中断函数* 参    数:无* 返 回 值:无* 注意事项:此函数为中断函数,无需调用,中断触发后自动执行*           函数名为预留的指定名称,可以从启动文件复制*           请确保函数名正确,不能有任何差异,否则中断函数将不能进入*/
void TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)		//判断是否是TIM2的更新事件触发的中断{//Delay_ms( 10);Num = TIM3_GetNumber();                                  //TIM3的CNT值赋值给Num,该值在1s中断中        // Delay_ms( 100);TIM_SetCounter( TIM3, 0);                               //TIM3的CNT清零    TIM_Cmd(TIM2, DISABLE);                                 //关闭TIM2定时器TIM_SetCounter( TIM2, 0);                               //TIM2 CNT计数清0 TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);                 //使能TM3捕获中断   TIM_ClearITPendingBit(TIM2, TIM_IT_Update);             //清除TIM2更新事件的中断标志位}
}

ICfeq.c

#include "stm32f10x.h"                  // Device headervoid IC_Init(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);    //开启TIM3外设时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);   //开启GPIOA外设时钟GPIO_InitTypeDef GPIO_InitStruct;                   //GPIO功能设置GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU ;GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_6 ;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz ;GPIO_Init( GPIOA, &GPIO_InitStruct);TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;   //时基单元设置TIM_TimeBaseInitStruct.TIM_ClockDivision  = TIM_CKD_DIV1 ;//该处设置对于目前的程序信号好像不起作用,最起码结果上不起作用因此默认为不分频TIM_TimeBaseInitStruct.TIM_CounterMode  = TIM_CounterMode_Up  ;TIM_TimeBaseInitStruct.TIM_Period  = 65536-1  ;  //ARRTIM_TimeBaseInitStruct.TIM_Prescaler  = 1-1 ;   //Psc,设置为不分频即1个触发信号触发一次TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);TIM_ICInitTypeDef   TIM_ICInitStruct;          //信号输入捕获设置TIM_ICStructInit(&TIM_ICInitStruct);TIM_ICInitStruct.TIM_Channel = TIM_Channel_1  ;TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising   ;TIM_ICInitStruct.TIM_ICFilter = 0x0F ;TIM_ICInit(TIM3,  &TIM_ICInitStruct);
//   TIM_SelectInputTrigger( TIM3, TIM_TS_TI1FP1);TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_External1);TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);  //TM3捕获1中断使能// 配置TIM3中断NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;        //响应优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);TIM_Cmd( TIM3, ENABLE);   //时钟使能}uint16_t TIM3_GetNumber(void)
{return TIM_GetCounter(TIM3);}void TIM3_IRQHandler(void)
{if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET){             TIM_Cmd(TIM2, ENABLE);  // 使能TIM2定时器                   TIM_ClearITPendingBit(TIM3, TIM_IT_CC1); // 清除中断标志TIM_ITConfig(TIM3, TIM_IT_CC1, DISABLE);//TIM3关闭捕获中断}
}

     程序的其它组件部分参考江科大的文件,TIM2的定时是1S,输入信号是1KHZ的PWM,输入端口是PA6,现在的程序与笔者之前的测频法比较。现在的程序更合理点,如果在主函数中断赋值语句前插入延时语句

Delay_ms( 10);Num = TIM3_GetNumber();                                  //TIM3的CNT

,那么最终得到的CNT值是会变大,前一个测频法程序是不会的,前一个测频法只能测试连续输入PWM。如果信号比较离散的话,它测试结果会变的不准确。


      分享一下学习过程中发生的错误,之前这个代码一直有个BUG,编码器旋钮你随便转的话可能会导致程序死机卡死。后面想了不少时间,找的问题是中断优先级照成的。

TIM3的中断控制着TIM2的中断,并且进入中断会使自身中断关闭。TIM2中断会关闭自身的定时器并使能TIM3中断,如过有中断嵌套的话,位置不对就会死机。笔者之前的中断优先级设置的不合理,就出现死机了。

http://www.whsansanxincailiao.cn/news/32019096.html

相关文章:

  • 成都创新互联做网站/谷歌手机版下载安装
  • .我爱你 域名网站/站长统计app下载大全
  • 动态网站制作报价/网络营销的特点是什么?
  • 代做网站平台/网络营销费用预算
  • 云主机可以做网站吗/自助建站系统源码
  • 网站的风格分析/2022近期时事热点素材摘抄
  • 做招聘长图用什么网站/目录型搜索引擎有哪些
  • 网站空间什么意思/网店如何推广
  • 进一步加大网站集约化建设力度/广州seo外包公司
  • 微网站建设包括哪些内容/培训班管理系统 免费
  • 大连微网站建设/网络广告营销典型案例
  • 拖拉建网站/免费网站流量统计
  • 品牌网站建设策/长沙官网seo技巧
  • 重庆做网站建设的公司哪家好/关键词点击排名软件
  • 视频网站怎么做算法/seo搜索推广费用多少
  • 营销型网站有哪些出名的/搜狗seo快速排名公司
  • 深圳做步步高的公司网站/海外推广营销 平台
  • 网站做支付需要什么备案/小红书seo排名规则
  • 学校网站报价单/郑州制作网站公司
  • 线上外贸平台有哪些/seo到底是什么
  • 怎么用indesign做网站设计/超级软文
  • 品牌网官网/长沙seo网络优化
  • 深圳好看的公司网站/好搜网
  • 抖音小姐姐做我女朋友网站/seo1视频发布会
  • 电子工程网络维护记录/惠州seo网站排名
  • 将html嵌入wordpress/沈阳专业seo排名优化公司
  • 怎么做网站推/优化服务
  • 做网站用php还是java/优化百度seo
  • 淘客二级域名网站免费建设/欧洲网站服务器
  • wordpress添加二级菜单/大同优化推广