在实验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");  
  }
}

STM32F103之实验2控制1个电机并采用编码器读取电机转速(代码)相关推荐

  1. 步进电机正反转实验_一种三相电机正反转控制互锁的考虑-成都电气开发

    最近一个客户找到我想做一个控制器的改造,这个控制器会根据传感器采集到的数据控制一个三相电机的正反转来实现预期的目的,但是客户却指出之前的控制器老是烧线,搞得他很恼火,所以他想找我来重新设计一下这个控制 ...

  2. 【Ethercat CSP控制模式下电机卡顿原因分析及解决方法】

    Ethercat CSP控制模式下电机卡顿原因分析及解决方法 ethercat总线经过近十年的发展,逐渐成为国际上最广泛应用的实时以太网总线之一.国外商业化的ethercat主站价格昂贵,国内尚未有全 ...

  3. 计算机组成原理 控制冒险,电子科大-系统结构实验-解决控制冒险.docx

    电子科大-系统结构实验-解决控制冒险 实验报告课程名称:计算机系统结构实验学 院:计算机科学与工程学院专 业:计算机科学与技术指导教师:好老师学生姓名:爱学习的大哥哥2014666666666实验成绩 ...

  4. 微型计算机原理中断实验,微机原理实验---中断控制实验.doc

    微机原理实验---中断控制实验 深 圳 大 学 实 验 报 告 课程名称: 微机计算机设计 实验项目名称: 8259 中断控制实验 学院: 信息工程学院 专业: 电子信息工程 指导教师: 报告人: 学 ...

  5. 操作系统实验进程控制(C语言版)

    操作系统实验进程控制 1.实验目的 2.实验内容 3.实验准备 3.1进程 3.1.1进程的含义 3.1.2进程状态 3.1.3进程状态之间的装换 3.2进程控制块 3.3进程的创建与撤消 3.4进程 ...

  6. 【电机应用控制】——直流有刷电机驱动板/编码器介绍PID算法实操代码思路

    目录 前言 一.电机简介 二.直流有刷电机 1.基本知识 2.直流有刷驱动板 3.编码器介绍 三.PID算法 四.实操思路 1.单环控制 2.双环控制 3.三环控制 拓:闭环死区 总结 前言 声明:学 ...

  7. 操作系统实验-进程控制(python实现)

    操作系统实验-进程控制(python实现) 一.实验目标 模拟操作系统对进程的管理.实现进程之间的切换. 二.实验要求 (1)单处理机,即一次只能 1 个进程处于运行态 (2)内核实现进程切换和进程调 ...

  8. FOC 无感 代码 算法 电机控制 PMSM 基于中颍SH32F2601的洗衣机量产无感bldc控制方案,电机控制算法完全手写

    FOC 无感 代码 算法 电机控制 PMSM 基于中颍SH32F2601的洗衣机量产无感bldc控制方案,电机控制算法完全手写,MCU寄存器配置完全手写,未用到任何库文件 ID:34500065518 ...

  9. 【STM32】使用HAL库进行电机测速,原理、代码、滤波

    参考资料: https://blog.csdn.net/lzzzzzzm/article/details/119416134 野火STM32电机开发教程 1. 编码器种类及原理 常见的编码器有两种,分 ...

最新文章

  1. Opencv函数手册
  2. SLAM小结——求解退化问题解析(F、H、E)(面试经验总结)
  3. python virtualenv用法
  4. FastDFS 集群配置(转载)
  5. AnyChat Server SDK与SDK Filter Plus有何差异?
  6. 假如一个程序员有社交牛逼症
  7. java 访问频率限制_配置URL的访问频率限制
  8. SAP License:移动类型107和109
  9. OGRE学习笔记(一)通过例子了解场景管理器---------地形创建
  10. 如何为约束更改设置动画?
  11. Canvas API(画布)简介
  12. 工业机器人图册 索罗门采夫_机械手控制系统设计(完整图纸)
  13. 阿里钉钉、蚂蚁、饿了么,淘宝真实面试分享
  14. Layui的基本使用(前端登录操作步骤)
  15. 论文《Contrastive Learning for Sequential Recommendation》
  16. Linux环境下MySql卸载
  17. 随机信号的参数建模法--AR模型及Matlab实现
  18. 东北大学材料成型工艺学中挤压拉拔部分复习2
  19. 单细胞数据分析工具scvi介绍
  20. VS20134连接不上SQL server

热门文章

  1. 2023多站点城市分站,泛站群
  2. 江南爱窗帘十大品牌 | 主卧用什么窗帘最好 主卧窗帘颜色搭配有技巧
  3. Hadoop和大数据技术精讲班
  4. Cadence OrCAD Capture 属性显示的无用信息太长的解决方法
  5. Windows下报蓝屏/绿屏代码UNEXPECTED_STORE_EXCEPTION错误或爆音、死机的解决方案
  6. centos7.9 部署 zabbix6.0 + mysql (docker-compose)
  7. 用Keil验证8位和32位单片机变量占用空间大小
  8. python数据结构那本书好_推荐一本书《Data Structures and Algorithms in Python》
  9. 信息学奥赛一本通:2072:【例2.15】歌手大奖赛
  10. WCS(Web Coverage Service):Geoserver