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

有没有做链接的网站吗百度关键词排名批量查询

有没有做链接的网站吗,百度关键词排名批量查询,公司宣传片拍摄脚本,wordpress 分类目录描述显示一、编码器简介 编码电机 旋转编码器 A,B相分别接通道一和二的引脚,VCC,GND接单片机VCC,GND 二、正交编码器工作原理 以前的代码是通过触发外部中断,然后在中断函数里手动进行计次。使用编码器接口的好处就是节约软件资源。对于频…

一、编码器简介

编码电机

旋转编码器

A,B相分别接通道一和二的引脚,VCC,GND接单片机VCC,GND

二、正交编码器工作原理

以前的代码是通过触发外部中断,然后在中断函数里手动进行计次。使用编码器接口的好处就是节约软件资源。对于频繁执行,操作简单的任务,一般设计一个硬件电路模块来自动完成。

使用定时器的编码器接口,再配合编码器,就可以测量旋转速度和旋转方向。编码器测速一般应用在电机控制的项目上。使用PWM驱动电机,再使用编码器测量电机的速度,然后再使用PID算法进行闭环控制。

平横车经常用到

1.计数方式

 2.框图分析

 由图可知,只有CH1和CH2有编码器接口,且编码器只用到了输入捕获结构体的输入滤波和边沿检测器,则其余的结构体成员都不用区配置。

 由框图可知,配置Encoder需要配置GPIO,输入捕获结构体的部分元素,时基单元,我们一般给ARR为65535-1,即最大计数量程,防止计数溢出。PSC=1-1,不分频,直接72M进行计数

3.计数方向与编码器信号的关系

 TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising)

这里TIM_EncoderMode_TI12即对应上面的计数边沿,仅在TI1和TI2计数就相当于只在A或B相的边沿计数,我们一般都使用AB相都计数

极性修改:可以使用上方的函数进行,也可以硬件直接调换AB相引脚

三、固件库使用

 

1.开启GPIO和TIM的时钟

2.配置GPIO结构体,模式配置为上拉输入

3.不用配置内部时钟源,因为编码器托管了时钟,编码器接口就是带方向控制的外部时钟,      所以内部时钟就没有用了    

4.配置时基单元,计数模式就不用配置了,取决于编码器的AB相边沿,ARR为65535-1,     PSC = 1-1不分频

5.配置输入捕获单元(因为是由)TI1FP1和2接入到编码器接口的,所以捕获单元结构体    元素只需配置输入滤波和边沿检测即可,这里边沿检测给上升沿还是下降沿并不是说是

   哪个有效,因为编码器模式下上/下沿都有效,这里指电平极性是否翻转,高电平不反转,

    低电平翻转

6.TIM_EncoderInterfaceConfig();配置编码器,TIM_Cmd();使能定时器

7.使用中断读取Encoder的值(测速度)

   若要测位置就直接读取Encoder的值即可,不需要中断

上拉输入还是下拉输入的选择

一般可以看一下接在这个引脚的外部模块输出的默认电平,如果外部模块空闲默认输出高电平,我们就选择上拉输入,默认输入高电平,如果外部模块默认输出低电平,我们配置下拉输入,默认输入低电平。总结,将需要配置电平的位置和外部模块保持默认状态一致,防止默认电平打架。

如果不确定外部模块输出的默认状态或者外部信号输出功率非常小,这时尽量选择浮空输入,浮空输入没有上下拉电阻去影响外部信号,缺点是当引脚悬空时,没有默认电平,输入就会受噪声干扰,来回不断跳变。

测位置:A、B相各出现了一个下降沿和上升沿,所以计次总共加了4次。

               如果转到0,再往左转,0自减,计数器反向溢出,回到自动重装值,65535,然后继续往下减

                解决方法是:如果我们想让0自减为-1,直接把uint16_t类型强制转换成int16_t即可

 

如果想让编码器测速度,可以在固定的闸门时间读一次CNT,然后把CNT清零,此时CNT的值代表速度,单位是脉冲个数/S 

(测频法)

#include "encoder.h"void Encoder_Init(void)
{//开启GPIO和TIM3时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//初始化GPIOGPIO_InitTypeDef GPIO_InitStruct;//定义GPIO结构体//GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;//输入不需要配置速度GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_IPU;GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_6 | GPIO_Pin_7;GPIO_Init(GPIOA,&GPIO_InitStruct);//因为编码器接口会托管时钟,编码器接口就是带方向控制的外部时钟,所以内部时钟就没有用了	//TIM_InternalClockConfig(TIM2);//配置时基单元//初始化时基单元TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_Prescaler = 1-1;//PSC-预分频器,给0,不分频//TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//计数方向被编码器托管了TIM_TimeBaseInitStruct.TIM_Period = 65535-1;//ARR寄存器-重装载寄存器TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;/*不分频----滤波器的采样频率,                                    可以由内部时钟直接提供,														                 也可以由内部时钟加一个时钟分频而来,分频系数就是由TIM_ClockDivision决定*/TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;//重复计数器,只有高级定时器才有	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_ICSelection //直连or交叉连//TIM_ICInitStruct.TIM_ICPrescaler //分频器因子,即每N个边沿跳变事件捕获一次-CCMR1_ICPSTIM_ICInitStruct.TIM_ICFilter = 0xF;//CCMR1_ICFTIM_ICInit(TIM3, &TIM_ICInitStruct);TIM_ICInitStruct.TIM_Channel = TIM_Channel_2;TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;//电平极性选择,高电平极性不反    转,低电平极性反转TIM_ICInitStruct.TIM_ICFilter = 0xF;//CCMR1_ICFTIM_ICInit(TIM3,&TIM_ICInitStruct);TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);//这里的上升沿和上面结构体配置的效果一样,所以前面的可以删去//使能TIMTIM_Cmd(TIM3,ENABLE);
}int16_t Encoder_Get(void)//int16_t 为了显示负数
{int16_t temp;temp = TIM_GetCounter(TIM3);TIM_SetCounter(TIM3,0);//这里每次获得了编码器的值后就清零CNT是为了得到速度//我们使用了中断,一秒进入一次然后读取CNT的值作为旋转速度return temp;
}
#include "bsp_tim.h"void Time_Config()
{//开启时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//选择时基单元的时钟-为内部时钟--定时器上电后默认是内部时钟,故不写这一个也行TIM_InternalClockConfig(TIM2);//初始化时基单元TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_Prescaler = 7200-1;//PSC-预分频器TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数 TIM_TimeBaseInitStruct.TIM_Period = 10000-1;//ARR寄存器-重装载寄存器TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;/*不分频----滤波器的采样频率,可以由内部时钟直接提供,也可以由内部时钟加一个时钟分频而来,分频系数就是由TIM_ClockDivision决定*/TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;//重复计数器,只有高级定时器才有TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);//使能中断-事件更新TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);TIM_ClearFlag(TIM2,TIM_IT_Update);//因为TIM_TimeBaseInit函数最后有一个直接操作UG位的操作//使得直接产生了一个更新事件,因此直接进行给UIE位置1//直接进入了中断,使得我们初始化ARR和PSC还未写入到//影子寄存器,使得Num一上电就是1//所以在进入中断之前先清楚中断标志位//使能中断之后就要进入NVIC了//先优先级分组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//配置结构体NVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;//中断通道NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStruct);//启动定时器TIM_Cmd(TIM2,ENABLE);//在_it文件里编写中断服务函数
}
#include ".\tim\bsp_tim.h"
#include "encoder.h"
#include ".\OLED\OLED.h"int16_t speed;
int main()
{Time_Config();Encoder_Init();OLED_Init();while(1){OLED_ShowSignedNum(1,5,speed,5);}
}
void TIM2_IRQHandler()
{//先获取中断标志位if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET){speed = Encoder_Get();//清楚中断标志位TIM_ClearFlag(TIM2,TIM_FLAG_Update);}
}

http://www.dt0577.cn/news/24756.html

相关文章:

  • 模型下载网站开发流程今天宣布疫情最新消息
  • 与客户沟通网站建设的技巧网站排名查询工具
  • 个人做电子商务网站备案永州网站seo
  • 开发 网站 沈阳市场调研
  • 学校网站 cms百度爱采购服务商查询
  • 如何建设自己的公司网站百度竞价开户费用
  • 哈尔滨网站制作推广百度快照怎么打开
  • wordpress网站用户注册免费开源代码网站
  • 论坛网站怎么做郑州客串seo
  • 做电影网站合法吗怎么卸载windows优化大师
  • dw做网站视频教程央视网新闻
  • 党员写试卷需要在哪个网站做域名邮箱 400电话
  • 驻马店建设网站seo诊断报告
  • 重庆有的设计网站大全济南头条今日新闻
  • 12306网站做的真垃圾爱站在线关键词挖掘
  • 闵行区属于浦东还是浦西seo公司怎样找客户
  • 性男女做视频观看网站2023新闻热点摘抄
  • 深圳时事热点新闻国内专业seo公司
  • 加急网站备案今天重大新闻头条新闻军事
  • 上门做美容的有什么网站全网营销推广方式
  • 微信网站开发模板b站推广费用一般多少
  • 我国档案网站建设比较分析最新热搜榜
  • 知名企业网站人才招聘情况如何网站排名英文
  • 网站设计照着做 算侵权吗性价比高seo的排名优化
  • https网站搭建子域名大全查询
  • 网站制作网站建设需要多少钱企业自助建站
  • 日本做电子贺卡网站网页模板网站
  • 小型的b2c网站营销目标分为三个方面
  • vps 上怎么做网站seo优化推广
  • 厦门外贸公司做网站seo分析工具有哪些