历史上的今天
今天是:2024年09月16日(星期一)
2018年09月16日 | STM32的编码器开发设置笔记
2018-09-16 来源:eefocus
在这里使用TIM3的通道1和通道2做为A B项的电平捕捉。
由于STM32自带硬件编码器接口,因此只要设置好就可使用,非常强大,下面程序测试通过。
void TIM3_Mode_Config(void)
{
//u16 CCR1_Val = 2500;
//u16 CCR2_Val = 1000;
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
//TIM_OCInitTypeDef TIM_OCInitStructure;
/*----------------------------------------------------------------*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_StructInit(&GPIO_InitStructure);
/* Configure PA.06,07 as encoder input */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*----------------------------------------------------------------*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能TIM3
TIM_DeInit(TIM3);
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Period =0xffff; //
TIM_TimeBaseStructure.TIM_Prescaler =0; //设置预分频:
TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1 ; //设置时钟分频系数:不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
//TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1;
/*初始化TIM2定时器 */
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
/*-----------------------------------------------------------------*/
//编码配置 编码模式
TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12,
TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); //TIM_ICPolarity_Rising上升沿捕获
TIM_ICStructInit(&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_ICFilter = 6; //比较滤波器
TIM_ICInit(TIM3, &TIM_ICInitStructure);
//TIM_ARRPreloadConfig(TIM3, ENABLE);
// Clear all pending interrupts
TIM_ClearFlag(TIM3, TIM_FLAG_Update);
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); //使能中断
//Reset counter
TIM3->CNT =0;
TIM_Cmd(TIM3, ENABLE); //使能定时器3
}
void TIM_Init(void)
{
TIM3_Mode_Config();
}
在主程序中通过串口定时发送。
[cpp] view plain copy
int main(void)
{
SystemInit();// 72m时钟
SysTick_Init();
TIM_Init();
NVIC_Config();
GPIO_74HC595_Config();
while (1)
{
encoder_num=TIM_GetCounter(TIM3);
// dis_595(encoder_num,encoder_num);
}
}
史海拾趣
|
本帖最后由 paulhyde 于 2014-9-15 03:33 编辑 来源:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3648721&bbs_page_no=1&bbs_id=9999 暑假学校里做机器人比赛,就是做出一个人型机器人来互相对打,要求无线控制的。 我因为去年做过这个 ...… 查看全部问答> |
|
应用场合不同,选择交流或直流取决于线圈,直流接触器的线圈只能通直流,交流接触器的线圈只能通交流工作。一般来说,在交流回路当中,主回路用的交流,辅助助回路一般都是从主回路上取电做控制回路,那么控制回路显然也是交流的,那么就要用交流接 ...… 查看全部问答> |
|
小弟刚上手驱动开发不久,现在用PB5.0做驱动。 现在是想按扇区读写全部的flash rom,我知道PB中有FMD_WriteSector等函数可以读写扇区,但不知道如何调用? 另外我还想问一下,用PB FOR CE5.0写的驱动能在windows mobile 上面用吗? 谢谢各位高手… 查看全部问答> |
|
#include <STM8S105C_S.h> #define uchar unsigned char #define uint unsigned int #define data_out PB_DDR|=0X04; #define data_in PB_DDR&=~0X04; #define scl_H PB_ODR|=0X02; #define scl_L PB_ODR&=~0X02; #define sda_ ...… 查看全部问答> |
|
用f123做了个电路板,用的是前2年的片子,烧写调试成功,偶然间不小心烧了片子,换了新的(刚买的),然后就提示60错误,找不到设备,请教斑竹为什么?头都大了,电路没问题的,用的是同样的电路板(同一批做的),元件也一样,是什么问题啊? 1。 ...… 查看全部问答> |
|
lowlevel_init.S的system_clock_init函数放到C语言下面实现——更好处理 在uboot原来的代码里,有系统时钟的初始化函数,在board/samsung/smdkv210/lowlevel_init.S的system_clock_init函数,我大概看了一下,寄存器不一样,而且是汇编写的,所以我就改成用c语言来实现,在BL1阶段初始化一下,BL2阶段就不用重新初始化了 ...… 查看全部问答> |




