在实验1的电机驱动基础上,这里补充编码器测速的程序部分
#include "encoder.h"
#include "led.h"
///TIM4 编码器输入,TIM4_CH1作A相,TIM4_CH2作B相GPIO_Pin_6|GPIO_Pin_7;
TIM_ICInitTypeDef TIM_ICInitStructure;
void TIM4_Encoder_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);// 使能定时器时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //io口使能使用到的捕获编码器AB相借,
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//推挽输出 ,IO口速度为50MHz
//初始化TIM4的时机单元
TIM_TimeBaseStructure.TIM_Period = 899; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 80K
TIM_TimeBaseStructure.TIM_Prescaler =0; //设置用来作为TIMx时钟频率除数的预分频值 不分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
//配置对应寄存器为编码器接口模式以及配置相关的输入捕获配置
//THE MODE OF ENCODER
TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12,TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
//TIM_ICPolarity_Rising上升沿捕获
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01 选择输入端 IC1映射到TI1上
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
TIM_ICInitStructure.TIM_ICFilter = 0x01;//IC1F=0000 配置输入滤波器 不滤波
TIM_ICInit(TIM4, &TIM_ICInitStructure);
// Enable the TIM4 Update Interrupt
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_ClearFlag(TIM4, TIM_FLAG_Update);
TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
TIM_SetCounter(TIM4,0);
TIM_Cmd(TIM4, ENABLE); //使能TIM4
}
u8 TIM4CH1_CAPTURE_STA=0; //输入捕获状态
u16 TIM4CH1_CAPTURE_VAL; //输入捕获值
//定时器4中断服务程序
void TIM4_IRQHandler(void)
{
if((TIM4CH1_CAPTURE_STA&0X80)==0)//还未成功捕获
{
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
{
if(TIM4CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
{
if((TIM4CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
{
TIM4CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
TIM4CH1_CAPTURE_VAL=0XFFFF;
}else TIM4CH1_CAPTURE_STA++;
}
}
TIM_ClearITPendingBit(TIM4, TIM_IT_Update); //清除中断标志位
}
}
float HF_Get_Encode_TIM4(void)
{
float cnt;
cnt = (float)((uint16_t)0x7fff) - (float)((uint16_t)(TIM4->CNT)) ;
TIM4->CNT = 0x7fff;
return cnt;
}
主函数如下:
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "pwm.h"
#include "usart.h"
#include "encoder.h"
int main(void)
{
int cnt;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
myusart_init(9600); //串口初始化为9600
LED_Init();//初始化与LED连接的硬件接口
TIM1_PWM_Init(899,0);//不分频。PWM频率=72000/(899+1)=80Khz . 电机的频率不得小于10K
TIM4_Encoder_Init(9999,72-1);//1s
// HF_Encoder_Init(TIM4,0);
while(1)
{
TIM_SetCompare1(TIM1,600);
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
delay_ms(100);
GPIO_SetBits(GPIOD,GPIO_Pin_2);
delay_ms(100);
cnt=(int)TIM_GetCounter(TIM4);
printf("Position = %d\n\r", cnt);
printf("陈xx最漂亮\r\n");
}
}
上一篇:关于STM32的编码器计数及溢出处理调试总结
下一篇:stm32f2xx与stm32f10x在正交编码器应用定时器初始化中的区别
推荐阅读
史海拾趣
随着公司的发展,Codeco逐渐意识到技术创新的重要性。他们投入大量资源研发新技术,不断提升产品的性能和用户体验。在一次关键的研发项目中,Codeco的团队突破了某项技术难题,推出了一款引领行业潮流的新产品。这一创新不仅为公司带来了可观的收益,也进一步巩固了Codeco在电子行业的地位。
在过去的四十年中,Hammond将业务重心扩展到了美国和国际市场。通过在全球各地设立办事处和建立分销网络,Hammond成功地将其产品和服务推广到了世界各地。这一战略转型不仅极大地提升了Hammond的品牌影响力,还为其带来了更加广阔的市场空间和增长潜力。
Exclara Inc.自创立之初就致力于研发创新技术,以满足电子行业对高性能、低功耗产品的需求。公司通过不断的技术突破,成功开发出了一系列具有竞争力的产品。例如,其采用HVX技术构成的驱动电源在T8型LED市场中脱颖而出,相比同规格方案,能够降低30%的BOM成本,这一技术革新不仅提升了产品的竞争力,也为公司赢得了市场的广泛认可。
2012年1月,伊士曼柯达公司宣布申请破产保护。这一消息震惊了全球,也让人们不禁对这家百年老店的前景感到担忧。然而,在破产保护期间,柯达并没有放弃努力。公司积极寻求重组方案,通过出售非核心资产、削减成本等方式,逐步恢复了盈利能力。最终,在2013年5月,柯达成功退出了破产保护程序,开始了新的发展历程。
经过破产保护和重组的洗礼后,伊士曼柯达公司更加注重创新和可持续发展。公司加强了与新兴科技公司的合作,积极探索新的业务模式和市场机会。同时,柯达还致力于研发更加环保、高效的影像产品和技术,以满足客户对高品质影像的需求。未来,伊士曼柯达公司将继续秉承创新、品质、服务的理念,不断推动影像行业的发展和进步。
伊士曼柯达公司由发明家乔治·伊士曼于1880年创立,最初名为伊斯曼干版公司。伊士曼的初衷是提供一种更便捷、更经济的摄影方式,以满足大众对摄影的日益增长的需求。他通过不断的研发和创新,成功推出了易于使用的胶卷和相机,使摄影技术得以普及。这一创新不仅改变了摄影行业的格局,也为伊士曼柯达公司的后续发展奠定了坚实的基础。
IT架构从最开始出现,到现在已经渗透到各个企业、各个机构信息化的处理过程当中,实际上走过了几个阶段。我简单的把IT系统承载的价值链,在时间层面做一个简单的总结。如果把以太网的速率映射上,也会发现很有意思,最开始以太网第一个发展阶段过程 ...… 查看全部问答∨ |
|
我在程序中创建了一个主表面,因为不能为独占模式,所以采用用覆盖页面over lay的方式来显示图片。因此创建了带一个缓冲的覆盖页面。基本想法是把yuyv格式的图片copy到其中一个覆盖页面,然后再blt到另一个覆盖页面,最后显示出来,实 ...… 查看全部问答∨ |
|
我用程序将编辑框的字体变大了,可是框的光标没有变大。举个例子,我在编辑框框中输入8,框内只能显示8的上半部分,下半部分显示不出来,而且即使把框拉大后数字还是无法显示完全,这是为什么啊??… 查看全部问答∨ |
|
最近自己查资料,参考强手的一些好方案,设计了一个Cylone2的FPGA板子,后续我整理完,将把资料上传,我怎么没找到怎么上传呢? [ 本帖最后由 鑫海宝贝 于 2010-11-24 09:31 编辑 ]… 查看全部问答∨ |