读取编码器数值实现电机测速

  • 电机系列
    • 二、读取编码器数值实现电机测速
      • 1 、配置串口通信;
        • usart.h
        • usart.c
        • main.c
      • 2 、配置编码器;

电机系列

二、读取编码器数值实现电机测速

1 、配置串口通信;

usart.h

#ifndef __USART_H
#define __USART_H
#include "stdio.h"
#include "sys.h" #define USART_REC_LEN            200     //定义最大接收字节数 200
#define EN_USART1_RX            1       //使能(1)/禁止(0)串口接收extern u8  USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符
extern u16 USART_RX_STA;                //接收状态标记
//如果想串口中断接收,请不要注释以下宏定义
void uart_init(u32 bound);
void USART3_Init(u32 bound);
int fputc(int ch,FILE *f);#endif

usart.c


#include "stm32f10x_gpio.h"
#include "stm32f10x_usart.h"
#include "stdio.h"volatile unsigned char *rx_address;
volatile unsigned int rx_count;
volatile unsigned int rx_length;/********** 禁用半主机模式 **********/
#pragma import(__use_no_semihosting)struct __FILE
{int a;
};FILE __stdout;void _sys_exit(int x)
{}/// 重定向c库函数printf到USART3
int fputc(int ch, FILE *f)
{/* 发送一个字节数据到USART3 */USART_SendData(USART3, (uint8_t) ch);/* 等待发送完毕 */while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);      return (ch);
}/// 重定向c库函数scanf到USART3
int fgetc(FILE *f)
{/* 等待串口1输入数据 */while (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET);return (int)USART_ReceiveData(USART3);
}void USART3_Init(u32 bound)
{//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);// 需要使能AFIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);  //使能GPIO时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);    //使能USART时钟GPIO_PinRemapConfig(GPIO_PartialRemap_USART3, ENABLE);//USART_TX  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //Pc10GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //复用推挽输出GPIO_Init(GPIOC, &GPIO_InitStructure);//USART_RX      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//Pc11GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOC, &GPIO_InitStructure);//UsartNVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;        //子优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;          //IRQ通道使能NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器//USART 初始化设置USART_InitStructure.USART_BaudRate = u32 bound;//串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式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(USART3, &USART_InitStructure);     //初始化串口3USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启串口接受中断USART_Cmd(USART3, ENABLE); USART_ITConfig(USART3,USART_IT_RXNE,ENABLE); //使能接收中断void USART3_IRQHandler(void)
}串口中断函数
//void USART3_IRQHandler(void)
//{//    u8 Res; //串口一次只能读取1个字符
//      if(USART_GetITStatus(USART3, USART_IT_RXNE)) //获取串口1接收状态标志位
//      {//       Res =USART_ReceiveData(USART3);   //读取接收到的数据
//       USART_SendData(USART3, Res);  //将接收到的数据原样发送
//       while(USART_GetFlagStatus(USART3, USART_FLAG_TC)!=SET); //等待发送结束
//     //USART3->DR=USART_RX_BUF[t]; //寄存器版本串口发送数据方法,数据寄存器 USART_DR可以存放要发送的数据
//       //while((USART3->SR&0X40)==0); //USART_SR 寄存器的TC位置0时数据发送结束
//    }
//}/********************************************************************************************************
函数名称:void USART3_Send(unsigned char *tx_buf, int len)
函数功能:串口1发送函数
硬件连接:PC10----TXD,PC11----RXD
备    注:
日    期:
*********************************************************************************************************
*/
void USART3_Send(unsigned char *tx_buf, int len)
{USART_ClearFlag(USART3, USART_FLAG_TC);USART_ClearITPendingBit(USART3, USART_FLAG_TXE);while(len--){USART_SendData(USART3, *tx_buf);while(USART_GetFlagStatus(USART3, USART_FLAG_TC) != 1);USART_ClearFlag(USART3, USART_FLAG_TC);USART_ClearITPendingBit(USART3, USART_FLAG_TXE);tx_buf++;}}/*********************************************************************************************************
函数名称:void USART3_Receive(unsigned char *rx_buf, int len)
函数功能:串口1接收函数
硬件连接:PC10----TXD,PC11----RXD
备    注:
日    期:
*********************************************************************************************************
*/
void USART3_Receive(unsigned char *rx_buf, int len)
{rx_count = 0;rx_length = len;rx_address = rx_buf;
}
/*
********************************************************************************************************
函数名称:void USART3_IRQHandler(void)
函数功能:串口1中断服务函数
硬件连接:PC10----TXD,PC11----RXD
备    注:
日    期:
*********************************************************************************************************
*/
void USART3_IRQHandler(void)
{unsigned char Res;//u8 Res;if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾){Res = USART_ReceiveData(USART3);//printf("[USART3_IRQHandler],Rec_data = %x\r\n", Res);if(rx_length > rx_count){*rx_address = Res;rx_address++;rx_count++; }USART_ClearITPendingBit(USART3, USART_IT_RXNE);}
}

main.c

#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "motor.h"
#include "control.h"
#include "usart.h"
#include "encoder.h"
#include "stdio.h"int main(void)
{   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //串口设置中断优先级分组,即优先级分级个数//NVIC_PriorityGroup_2,代表抢占优先级位数位2,可以分[0, 1, 2, 3]四级优先级// 响应优先级位数位2,可以分[0, 1, 2, 3]四级优先级USART3_Init(); //调用串口1初始化函数//printf("11111");while(1){printf("nihao ");}
}

此时即可通过串口助手读到 printf输出的内容。

源码在下载区。

2 、配置编码器;

在工程中加入电机控制文件:

见下文;

二、读取编码器数值实现电机测速—1 、配置串口通信;相关推荐

  1. STM32C8T6编码器电机测速与arduino光电模块测速

    文章目录 前言 一.STM32编码器测速 定时器配置 配置四倍频 二.arduino光电测速 前言 前面也是只学习了四倍频测速的原理,并没有真正实验过,今天正好看到编码器电机了,就尝试一下 一.STM ...

  2. stm32编码器电机测速(hal库)

    记录一下今天参考别人的代码实现了四个电机的测速. 编码器被广泛应用于电机测速,实现电机闭环控制.所以不论是自己做小车还是后续参加各种比赛,必须要学会编码器测速. 一.参数 编码电机其实就是一个带有编码 ...

  3. STM32之增量式编码器电机测速

    STM32之增量式编码器电机测速 编码器 编码器种类 按监测原理分类 光电编码器 霍尔编码器 按输出信号分类 增量式编码器 绝对式编码器 编码器参数 分辨率 精度 最大响应频率 信号输出形式 编码器倍 ...

  4. STM32 CubeMax 编码器电机测速 原理与实现

    编码器电机测速 部分参考:https://blog.csdn.net/lzzzzzzm/article/details/119416134 其他参考部分见图片水印 1. 编码器种类及原理 常见的编码器 ...

  5. 07 TIM编码器和AB相电机测速

    AB相编码器 编码器分为光学和磁极. 编码器的性能指标单位:分辨率(转一圈输出多少个信号值) 精度390线的编码器:A相390个方波,B相390个方波.相位相差90°,实现4倍频,所以实现390*4= ...

  6. 基于MSP430f5529 编码电机测速 接收脉冲数 PWM调速 CCS编译器 代码分析

    前言:2022年TI杯大学生电子设计竞赛,小车跟随行驶系统(C题)要求:设计一套小车跟随行驶系统,采用TI的MCU,由一辆领头小车和一辆跟随小车组成,要求小车具有循迹功能,且速度在0.3~1m/s可调 ...

  7. STM32应用开发实践教程:智能小车电机测速模块的应用开发

    3.4.1 任务分析 本任务要求设计一个可实现智能小车电机测速的应用程序,具体要点如下. ① 取一个电机作为测速对象. ② 支持按键控制,使用 4 个按键,功能描述如下:  Key1 控制电机正转, ...

  8. linux直流电机测试,带霍尔传感器编码器的直流减速电机测速原理讲解(附源码)...

    查看: 14294|回复: 83 带霍尔传感器编码器的直流减速电机测速原理讲解(附源码) 高级会员, 积分 891, 距离下一级还需 109 积分 积分金钱891 注册时间2019-4-22 在线时间 ...

  9. S7-1200 PLC通过编码器实现高速计数器的测速功能

    S7-1200 PLC通过编码器实现高速计数器的测速功能 PLC通过计算单位时间内编码器反馈回来的脉冲数量来测出电机的实时转速,这里编码器使用A/B相计数. 在CPU中的组态配置中"启用该高 ...

最新文章

  1. OKR能给公司和团队带来什么价值?
  2. 成功解决基于VS2015(Visual Studio2015)编写C++程序调试时弹出窗口一闪而过的问题
  3. .git文件夹_Git幸存者指南
  4. eBay邓明:dubbo-go 中 metrics 的设计
  5. windows永久添加路由
  6. log4j.appender.stdout.layout.ConversionPattern
  7. 大数据之-Hadoop3.x_MapReduce_ReduceTask源码解析---大数据之hadoop3.x工作笔记0127
  8. 嬴彻科技这一年:“姚班”天才加盟、运力模式显现、已有商业化收入
  9. 使用Mybatis如何对Mysql进行分页功能?
  10. 主函数是c语言的入口,代码逆向(一)——寻找main函数入口
  11. wordpress如何去掉顶部工具条
  12. 课程设计:波形发生器
  13. Prove the EXACT 4SAT is NP-complete.
  14. 计算机底层——计算机的发展史
  15. 区分Android中的各种单位——in、mm、pt、px、dp、dip、sp
  16. 我的前端学习资料 (附视频地址)
  17. C++技术的主要应用领域
  18. 8.3 有效工作量证明
  19. Linux快捷键使用汇总
  20. Centos下jira、confluence利用nginx 代理配置为统一入口

热门文章

  1. Android9.0 http网络请求失败问题分析与解决方案
  2. 创建型模式:原型模式
  3. 初学python:Python 3的下载、安装、第一个程序(Helloworld.py)与卸载
  4. 联盟广告回利模式4种
  5. 电视机@2022:降价、焦虑与机遇
  6. 13变积分限函数求极限问题
  7. 关于等高线导出的方法和疑问讨论
  8. 4月第2周业务风控关注 |互联网信息服务投诉平台正式上线试运行
  9. 如何将孩子的视频保存在YouTube历史记录之外
  10. 小白必看!数据库自学入门教程,免费的SQL认证课程