目录

前言

一、定时器部分和按键部分

二、PWM调速

三、电机驱动部分​​​​​​​

三、编码器接口部分(测速)

四.主函数

总结​​​​​​​


推荐STM32学习课程:

[6-8] 编码器接口测速_哔哩哔哩_bilibili[6-8] 编码器接口测速是STM32入门教程-2022持续更新中的第20集视频,该合集共计30集,视频收藏或关注UP主,及时了解更多相关视频内容。https://www.bilibili.com/video/BV1th411z7sn/?p=20&spm_id_from=pageDriver&vd_source=ed36b2700bbc2bac7746c270bc391540OLED显示屏代码:

STM32F103C8T6延时函数和OLED显示屏代码_HX091624的博客-CSDN博客

前言

电机编码器是安装在电机上的旋转编码器,它通过跟踪电机轴的速度和/或位置来提供闭环反馈信号。监视的参数由应用的类型确定,可以包括速度,距离,RPM,位置等。利用编码器或其他传感器控制的特定参数的应用称为闭环反馈或闭环控制系统


一、定时器部分和按键部分

#include "stm32f10x.h"                  // Device header//定时中断->1s
void Timer_Init(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);TIM_InternalClockConfig(TIM2);TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);TIM_ClearFlag(TIM2, TIM_FLAG_Update);TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&NVIC_InitStructure);TIM_Cmd(TIM2, ENABLE);
}/*
void TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET){TIM_ClearITPendingBit(TIM2, TIM_IT_Update);}
}
*/
#include "stm32f10x.h"    void Key_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);
}uint8_t Key_GetNum(void)
{uint8_t KeyNum = 0;if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0){Delay_ms(20);while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0);Delay_ms(20);KeyNum = 1;}return KeyNum;
}

二、PWM调速

#include "stm32f10x.h"
//定时器3->PWM调速  周期20MS  计一个数->1US
void PWM_Init(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//电动机PWM输出 PA6 PA7GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//舵机PWM输出  PB0GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);TIM_InternalClockConfig(TIM3);TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_Period = 20000 - 1;        //ARRTIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;     //PSCTIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);TIM_OCInitTypeDef TIM_OCInitStructure;TIM_OCStructInit(&TIM_OCInitStructure);TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse = 0;                 //CCRTIM_OC1Init(TIM3, &TIM_OCInitStructure);           //PWM输出引脚TIM_OC2Init(TIM3, &TIM_OCInitStructure);TIM_OC3Init(TIM3, &TIM_OCInitStructure);TIM_Cmd(TIM3, ENABLE);
}//左右电机输出比较
void PWM_SetCompare1(uint16_t Compare)
{TIM_SetCompare1(TIM3, Compare);
}void PWM_SetCompare2(uint16_t Compare)
{TIM_SetCompare2(TIM3, Compare);
}//舵机输出比较
void PWM_SetCompare3(uint16_t Compare)
{TIM_SetCompare3(TIM3, Compare);
}

三、电机驱动部分

电机:电机如何驱动在我之前的文章有写,这里就不再解释了。

#include "stm32f10x.h"
#include "PWM.h"//左右电机初始化
void Motor_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//电机控制模拟输入端GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//控制左电机->PA0 PA1 控制右电机->PA4 PA5GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1|GPIO_Pin_4 | GPIO_Pin_5;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);PWM_Init();
}//右边电机向前
void Right_moto_go(void)
{//正转GPIO_SetBits(GPIOA, GPIO_Pin_4);GPIO_ResetBits(GPIOA, GPIO_Pin_5);
}//右边电机向后
void Right_moto_back(void)
{//反转GPIO_ResetBits(GPIOA, GPIO_Pin_4);GPIO_SetBits(GPIOA, GPIO_Pin_5);
}//右边电机停止
void Right_moto_Stop(void)
{//停车GPIO_ResetBits(GPIOA, GPIO_Pin_4);GPIO_ResetBits(GPIOA, GPIO_Pin_5);
}//左边电机向前
void Left_moto_go(void)
{//正转GPIO_SetBits(GPIOA, GPIO_Pin_0);GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}//左边电机向后
void Left_moto_back(void)
{//反转GPIO_ResetBits(GPIOA, GPIO_Pin_0);GPIO_SetBits(GPIOA, GPIO_Pin_1);
}//左边电机停止
void Left_moto_Stop(void)
{//停车GPIO_ResetBits(GPIOA, GPIO_Pin_0);GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}
#include "stm32f10x.h"
#include "Motor.h"
#include "PWM.h"//小车调速函数
void Speed_Control(uint16_t Compare)
{Compare*=200;                 //100->20000 PWM_SetCompare1(Compare);   //调速PWM_SetCompare2(Compare);
}//小车前进函数
void run(uint16_t Compare)
{Speed_Control(Compare);Left_moto_go();             //左电机往前Right_moto_go();             //右电机往前
}//小车后退函数
void backrun(uint16_t Compare)
{Speed_Control(Compare);Left_moto_back();           //左电机往后Right_moto_back();           //右电机往后
}//小车停车函数
void stop(void)
{       Left_moto_Stop();           //左电机停止Right_moto_Stop();           //右电机停止
}

三、编码器接口部分(测速)

编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度。

#include "stm32f10x.h"                  // Device header
//测速
void Encoder_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//TIM1的CH1和CH2GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;       //ARRTIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1;      //PSCTIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStructure);//在TI1和TI2上计数TIM_ICInitTypeDef TIM_ICInitStructure;TIM_ICStructInit(&TIM_ICInitStructure);TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;TIM_ICInitStructure.TIM_ICFilter = 0xF;TIM_ICInit(TIM1, &TIM_ICInitStructure);TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;TIM_ICInitStructure.TIM_ICFilter = 0xF;TIM_ICInit(TIM1, &TIM_ICInitStructure);//定时器编码器接口配置  //通道不反相TIM_EncoderInterfaceConfig(TIM1, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);TIM_Cmd(TIM1, ENABLE);
}int16_t Encoder_Get(void)
{int16_t Temp;Temp = TIM_GetCounter(TIM1);TIM_SetCounter(TIM1, 0);return Temp;
}

四.主函数

#include "stm32f10x.h"
#include "Key.h"
#include "OLED.h"
#include "Timer.h"
#include "Motor.h"
#include "MotorRun.h"
#include "Encoder.h"int16_t Speed;
int8_t KeyNum;int main(void)
{Key_Init();OLED_Init();Timer_Init();Motor_Init();Encoder_Init();OLED_ShowString(1, 1, "Speed:");while (1){KeyNum=Key_GetNum();//电机旋转if(KeyNum==1){run(50);}OLED_ShowSignedNum(1, 7, Speed, 5); //显示速度}
}void TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET){//每隔一段时间获取速度Speed = Encoder_Get();TIM_ClearITPendingBit(TIM2, TIM_IT_Update);}
}

总结

注意:两个输入引脚借用了输入捕获的通道1和通道2,而接通道3和通道4是没有用的。

以上就是编码器电机的代码,欢迎大家留言评论,遇到问题都可以在评论区留言。

STM32F103C8T6编码器电机的使用相关推荐

  1. STM32控制编码器电机实现【速度闭环控制】与【位置闭环控制】

    一.硬件及接线说明 本实验所基于的硬件分别为: STM32F103C8T6 主控板 TB6612FNG 直流电机驱动模块 6线正交编码器电机(带AB相) 其中硬件接线为: PWMA -- PA8 AI ...

  2. 【手把手带你用pid算法控制电机】——(1)编码器电机和0.96寸OLED显示屏的使用

    目录 前言 一.需要用到的器材 二.接线说明 三.cubmx配置 3.1 时钟树 3.2 输出PWM(TIM4) 3.3 编码器模式(TIM3) 3.4 中断定时器配置(TIM1) 3.5 配置IIC ...

  3. STM32应用(九)编码器及其测速原理、L298N电机驱动控制编码器电机

    文章目录 1.L298N电机驱动 1.1 产品参数 1.2 实物图和接线 2.编码器 2.1 编码器简介 2.2 常用编码器分类 2.3 霍尔编码器实物图接线!!!! 2.4 编码器倍频原理 3.控制 ...

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

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

  5. STM32F103C8T6控制电机驱动模块298N驱动电机调速以及正反转(附代码资源包)

    STM32F103C8T6控制电机驱动模块298N驱动电机调速以及正反转 一. 硬件选型 1. stm32f103c8t6 2. L298N 3. 电机 4. 其他 二. 硬件连接(连接以接一路电机为 ...

  6. SimpleFOC之ESP32(八)—— ABZ编码器电机

    目录 一.增量式编码器介绍 二.ESP32drive控制霍尔电机 2.1.原理图 2.2.读编码器获取角度 2.2.1.硬件准备 2.2.2.硬件连接 2.2.3.代码演示 2.2.4.观察角度输出 ...

  7. SimpleFOC移植STM32(九)—— ABZ编码器电机

    目录 说明 一.ABZ编码器介绍 1.1.ABZ信号 1.2.光电式编码器 1.3.磁编码器 1.4.差分信号 二.电机驱动板103 2.1.读ABZ信号的cpr 2.1.1.接线 2.1.2.编译, ...

  8. STM32实现编码器电机【速度与位置环闭环控制】

    此文章提供了一个通用的函数接口,仅需配置相关IO.基于Hal库开发. 一.硬件及接线说明 1.1 硬件平台 控制芯片:STM32F103ZET6 电机驱动:TB6612 电机类型:520编码器电机(1 ...

  9. 直流电机与PID——编码器电机使用(一)

    直流电机与PID学习 文章目录 直流电机与PID学习 前言 一.直流电机原理 二.编码器电机 1.减速器作用 2.编码器电机接线 3.编码器原理 4.四倍频技术 5.单片机采集编码器数据 三.TB66 ...

最新文章

  1. Linux之vim中翻页的命令
  2. MySQL通讯协议研究2(登录认证)
  3. 延迟队列Delay Queue
  4. ES5-8 闭包高级、对象、构造函数、实例化
  5. 初学ASP.NET 必看
  6. 06-对图像进行腐蚀操作
  7. 史上最萌最认真的机器学习/深度学习/模式识别入门指导手册(二)
  8. 【Elasticsearch】es mapper_parsing_exception
  9. 无人驾驶时代指日可待?2035年将取代传统汽车
  10. Windows 编程[11] - WM_SIZE 消息
  11. MyEclipse中防止代码格式化时出现换行
  12. 51nod-1785:数据流中的算法
  13. linux shell常用函数,ps
  14. nmds与mds的区别_NMDS非度量多维尺度分析—基于微生物群落
  15. 最新SCI影响因子公布:国产期刊最高破46分!网友:算是把IF玩明白了
  16. springboot 过滤器
  17. linux双网卡双路由配置,linux配置双网卡双路由
  18. 被11整除的四位偶数c语言,位和位差-什么叫奇数位和偶数位?能被11整除的数,奇 – 手机爱问...
  19. 【网络收录】基于51单片机开发音乐播放器
  20. MySQL启动和关闭命令总结

热门文章

  1. IDEA中项目、模块和包的关系
  2. 深入浅出 详解Android Surface系统(1)
  3. linux命令-cat、zcat
  4. Spring源码-AnnotationConfigApplicationContext容器的创建过程
  5. 智慧党建云平台v4.0.5(公众号模块版)源码下载安装教程
  6. redis是什么,为什么要用redis?
  7. 14-【go】Go中time.Parse()和time.ParseInLocation()的区别
  8. VMware workstation 不可恢复错误(vcpu-0)
  9. 前端性能优化——图片优化
  10. 地缘剧本杀 (十三):逃亡(原创小说连载,内含语音)