8321|11

42

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

基于STM32单片机,光电编码器测速,接收不到信号 [复制链接]

 
基于STM32单片机,利用光电编码器测速,光电编码器转动但是串口上显示脉冲数一直是0.
代码如下:
#include "stm32f10x.h"
#include


void delay(uint32_t);
void COM_Config(void);
void GPIO_Configuration(void);
void TIM2_Configuration(void);

int fputc(int ch, FILE *f);
int fgetc( FILE *f);

int ActualSpeed=0;
int Times=1;

int main(void)
{
        COM_Config();
        GPIO_Configuration();
        TIM2_Configuration();
       
    while (1)
    {       
             delay(10000000);                
                 ActualSpeed=TIM_GetCounter(TIM2);
                 printf(" 实际转速=%d  %d \n\r",ActualSpeed,Times++);
    }   
}

void COM_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;  
    USART_InitTypeDef USART_InitStructure;

        /*使能GPIOD端口时钟、复用功能时钟*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);
        /*使能USART2时钟*/
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);   

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;  
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;  
    GPIO_Init(GPIOD, &GPIO_InitStructure);  

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;  
    GPIO_Init(GPIOD, &GPIO_InitStructure);  

        /*串口2重映射*/
        GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);   

    USART_InitStructure.USART_BaudRate = 115200;  
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;  
    USART_InitStructure.USART_StopBits = USART_StopBits_1;  
    USART_InitStructure.USART_Parity = USART_Parity_No;  
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;  
    USART_Init(USART2, &USART_InitStructure);  

    USART_Cmd(USART2, ENABLE);  
}

/*外部脉冲输入管脚         PC6 */
void GPIO_Configuration(void)
{

    GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;          
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}


/*TIM2对脉冲计数*/
void  TIM2_Configuration(void)
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);

    TIM_DeInit(TIM2);
    TIM_TimeBaseStructure.TIM_Period = 0xFFFF;      //?自动重装载值,值越小频率越大,值越大频率越小
    TIM_TimeBaseStructure.TIM_Prescaler = 0x0;      
    TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;  
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式

    TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);      
    TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);          //外部时钟模式2,计数器在选定输入端的每个上升沿计数
    TIM_SetCounter(TIM2, 0);           //设置寄存器寄存值
    TIM_Cmd(TIM2, ENABLE);
}

void delay(__IO uint32_t nCount)
{
  for (; nCount != 0; nCount--);
}


#ifndef MicroLIB
//#pragma import(__use_no_semihosting)             //没有实现fgetc时需要声明该参数   
/* 标准库需要的支持函数 使用printf()调试打印不需要实现该函数 */               
struct __FILE
{
        int handle;
    /* Whatever you require here. If the only file you are using is */   
    /* standard output using printf() for debugging, no file handling */   
    /* is required. */
};

FILE __stdout;      
//定义_sys_exit()以避免使用半主机模式   
_sys_exit(int x)
{
        x = x;
}
/* 重定义fputc函数 如果使用MicroLIB只需要重定义fputc函数即可 */  
int fputc(int ch, FILE *f)
{
    /* Place your implementation of fputc here */

         /* e.g. write a character to the USART */
    USART_SendData(USART2, (uint8_t) ch);

    /* Loop until the end of transmission */
    while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET)
    {}

    return ch;
}
/*
可以直接使用putchar
不需要再定义 int putchar(int ch),因为stdio.h中有如下定义
#define putchar(c) putc(c, stdout)
*/

int ferror(FILE *f) {  
    /* Your implementation of ferror */  
    return EOF;  
}
#endif

FILE __stdin;

int fgetc(FILE *fp)
{
        int ch = 0;
       
    while(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET)
    {
    }

    ch = (int)USART2->DR & 0xFF;
       
    putchar(ch); //回显
       
        return ch;
}

不知道哪里出错了,请各位大神指教。


此帖出自stm32/stm8论坛

最新回复

有次我发现没读数,后来发现是编码器没接电源。   详情 回复 发表于 2021-4-6 18:35
点赞 关注
 

回复
举报

42

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
实物图如下

IMG_20180324_205008.jpg (1.28 MB, 下载次数: 0)

IMG_20180324_205008.jpg
此帖出自stm32/stm8论坛
 
 

回复

1万

帖子

142

TA的资源

版主

板凳
 
用示波器看看编码器的输出。
此帖出自stm32/stm8论坛

点评

好的。 用示波器看编码器输出,编码器需要与电机连接吗?能够显示脉冲波形就证明编码器是正常的对吗?  详情 回复 发表于 2018-3-25 10:10
 
个人签名上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
 

回复

42

帖子

0

TA的资源

一粒金砂(中级)

4
 
chunyang 发表于 2018-3-24 23:54
用示波器看看编码器的输出。

好的。
用示波器看编码器输出,编码器需要与电机连接吗?能够显示脉冲波形就证明编码器是正常的对吗?
此帖出自stm32/stm8论坛

点评

用手转动编码器即可,速度低更容易观察。参照器件手册看波形,波形正常则编码器就没问题。  详情 回复 发表于 2018-3-25 16:11
 
 
 

回复

1万

帖子

142

TA的资源

版主

5
 
shrxh 发表于 2018-3-25 10:10
好的。
用示波器看编码器输出,编码器需要与电机连接吗?能够显示脉冲波形就证明编码器是正常的对吗?

用手转动编码器即可,速度低更容易观察。参照器件手册看波形,波形正常则编码器就没问题。
此帖出自stm32/stm8论坛

点评

蟹蟹  详情 回复 发表于 2018-3-26 09:37
 
个人签名上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
 
 

回复

4005

帖子

0

TA的资源

版主

6
 
天哪,你怎么设计的,绿白接一起从哪儿学来的呀
此帖出自stm32/stm8论坛

点评

和绿线接在一起的那根白线只是单纯的导线,不是光电编码器上带的那根。。。  详情 回复 发表于 2018-3-26 09:36
 
 
 

回复

4005

帖子

0

TA的资源

版主

7
 
可能要上拉电阻
此帖出自stm32/stm8论坛
 
 
 

回复

42

帖子

0

TA的资源

一粒金砂(中级)

8
 
huo_hu 发表于 2018-3-25 21:11
天哪,你怎么设计的,绿白接一起从哪儿学来的呀

和绿线接在一起的那根白线只是单纯的导线,不是光电编码器上带的那根。。。
此帖出自stm32/stm8论坛
 
 
 

回复

42

帖子

0

TA的资源

一粒金砂(中级)

9
 
chunyang 发表于 2018-3-25 16:11
用手转动编码器即可,速度低更容易观察。参照器件手册看波形,波形正常则编码器就没问题。

蟹蟹
此帖出自stm32/stm8论坛
 
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

10
 
你这个编码器应该是正交编码器的吧。。。。。。一般电机的测速都用到带光栅的正交编码器哦。
此帖出自stm32/stm8论坛
 
 
 

回复

1025

帖子

0

TA的资源

纯净的硅(高级)

11
 

没看见电路图。有很多编码器输出是OC方式,如果不加上拉是没有输出的;
另外,编码器需要供电,你电源是多大的;

其次,A、B、Z你用了那个,程序很乱,看不出逻辑来,你到底用了测周期法还是计数法,关键地方的注释不能反映你的意图,所以很难帮到你。

主程序重又用了一个10秒的延时,不知道什么意图。

此帖出自stm32/stm8论坛
 
个人签名چوآن شـين
 
 

回复

37

帖子

0

TA的资源

一粒金砂(中级)

12
 

有次我发现没读数,后来发现是编码器没接电源。

此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表