找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9530|回复: 10
打印 上一主题 下一主题
收起左侧

stm32电机速度闭环控制(代码详细注释)

  [复制链接]
跳转到指定楼层
楼主
ID:372737 发表于 2018-7-27 09:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
PID 源码,大家可以看看,讨论讨论。

单片机源程序如下:
  1. #include "sys.h"
  2. u8 Flag_Stop=1;            //停止标志位
  3. int Encoder;               //编码器的脉冲计数
  4. int Moto1;                 //电机PWM变量 应是Motor的 向Moto致敬       

  5. int main(void)
  6. {
  7.         Stm32_Clock_Init(9);            //系统时钟设置
  8.         delay_init(72);                 //延时初始化
  9.         LED_Init();                     //初始化与 LED 连接的硬件接口
  10.         uart_init(72,115200);           //初始化串口1
  11.         MiniBalance_PWM_Init(7199,0);   //=====初始化PWM 10KHZ 高频可以防止电机低频时的尖叫声
  12.         Encoder_Init_TIM2();            //初始化编码器
  13.   Timer3_Init(99,7199);           //=====10MS进一次中断服务函数,中断服务函数在control.c
  14.         while(1)
  15.                 {
  16.                         printf("%d\r\n",Encoder);       
  17.                 }
  18. }
复制代码
  1. #include "motor.h"
  2. void MiniBalance_Motor_Init(void)
  3. {
  4.         RCC->APB2ENR|=1<<3;       //PORTB时钟使能   
  5.         GPIOB->CRH&=0X0000FFFF;   //PORTB12 13 14 15推挽输出
  6.         GPIOB->CRH|=0X22220000;   //PORTB12 13 14 15推挽输出
  7. }
  8. void MiniBalance_PWM_Init(u16 arr,u16 psc)
  9. {                                                          
  10.         MiniBalance_Motor_Init();  //初始化电机控制所需IO
  11.         RCC->APB2ENR|=1<<11;       //使能TIM1时钟   
  12.         RCC->APB2ENR|=1<<2;        //PORTA时钟使能     
  13.         GPIOA->CRH&=0XFFFF0FF0;    //PORTA8 11复用输出
  14.         GPIOA->CRH|=0X0000B00B;    //PORTA8 11复用输出
  15.         TIM1->ARR=arr;             //设定计数器自动重装值
  16.         TIM1->PSC=psc;             //预分频器不分频
  17.         TIM1->CCMR2|=6<<12;        //CH4 PWM1模式       
  18.         TIM1->CCMR1|=6<<4;         //CH1 PWM1模式       
  19.         TIM1->CCMR2|=1<<11;        //CH4预装载使能         
  20.         TIM1->CCMR1|=1<<3;         //CH1预装载使能          
  21.         TIM1->CCER|=1<<12;         //CH4输出使能          
  22.         TIM1->CCER|=1<<0;          //CH1输出使能       
  23.         TIM1->BDTR |= 1<<15;       //TIM1必须要这句话才能输出PWM
  24.         TIM1->CR1=0x8000;          //ARPE使能
  25.         TIM1->CR1|=0x01;          //使能定时器1                                                                                           
  26. }

复制代码
  1. #include "encoder.h"

  2. /**************************************************************************
  3. 函数功能:把TIM2初始化为编码器接口模式
  4. 入口参数:无
  5. 返回  值:无
  6. **************************************************************************/
  7. void Encoder_Init_TIM2(void)
  8. {
  9.         RCC->APB1ENR|=1<<0;     //TIM2时钟使能
  10.         RCC->APB2ENR|=1<<2;    //使能PORTA时钟
  11.         GPIOA->CRL&=0XFFFFFF00;//PA0 PA1
  12.         GPIOA->CRL|=0X00000044;//浮空输入
  13.         /* 把定时器初始化为编码器模式 */
  14.         TIM2->PSC = 0x0;//预分频器
  15.         TIM2->ARR = ENCODER_TIM_PERIOD-1;//设定计数器自动重装值
  16.   TIM2->CCMR1 |= 1<<0;          //输入模式,IC1FP1映射到TI1上
  17.   TIM2->CCMR1 |= 1<<8;          //输入模式,IC2FP2映射到TI2上
  18.   TIM2->CCER |= 0<<1;           //IC1不反向
  19.   TIM2->CCER |= 0<<5;           //IC2不反向
  20.         TIM2->SMCR |= 3<<0;                  //SMS='011' 所有的输入均在上升沿和下降沿有效
  21.         TIM2->CR1 |= 0x01;    //CEN=1,使能定时器
  22. }
  23. /**************************************************************************
  24. 函数功能:把TIM4初始化为编码器接口模式
  25. 入口参数:无
  26. 返回  值:无
  27. **************************************************************************/
  28. void Encoder_Init_TIM4(void)
  29. {
  30.         RCC->APB1ENR|=1<<2;     //TIM4时钟使能
  31.         RCC->APB2ENR|=1<<3;    //使能PORTb时钟
  32.         GPIOB->CRL&=0X00FFFFFF;//PB6 PB7
  33.         GPIOB->CRL|=0X44000000;//浮空输入
  34.         /* 把定时器初始化为编码器模式 */
  35.         TIM4->PSC = 0x0;//预分频器
  36.         TIM4->ARR = ENCODER_TIM_PERIOD-1;//设定计数器自动重装值
  37.   TIM4->CCMR1 |= 1<<0;          //输入模式,IC1FP1映射到TI1上
  38.   TIM4->CCMR1 |= 1<<8;          //输入模式,IC2FP2映射到TI2上
  39.   TIM4->CCER |= 0<<1;           //IC1不反向
  40.   TIM4->CCER |= 0<<5;           //IC2不反向
  41.         TIM4->SMCR |= 3<<0;                  //SMS='011' 所有的输入均在上升沿和下降沿有效
  42.         TIM4->CR1 |= 0x01;    //CEN=1,使能定时器
  43. }
  44. /**************************************************************************
  45. 函数功能:单位时间读取编码器计数
  46. 入口参数:定时器
  47. 返回  值:速度值
  48. **************************************************************************/
  49. int Read_Encoder(u8 TIMX)
  50. {
  51.     int Encoder_TIM;   
  52.    switch(TIMX)
  53.          {
  54.            case 2:  Encoder_TIM= (short)TIM2 -> CNT;  TIM2 -> CNT=0;break;
  55.                  case 3:  Encoder_TIM= (short)TIM3 -> CNT;  TIM3 -> CNT=0;break;       
  56.                  case 4:  Encoder_TIM= (short)TIM4 -> CNT;  TIM4 -> CNT=0;break;       
  57.                  default:  Encoder_TIM=0;
  58.          }
  59.                 return Encoder_TIM;
  60. }


复制代码



所有资料51hei提供下载:
电机速度闭环控制(代码详细注释).rar (177.07 KB, 下载次数: 237)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:20672 发表于 2018-10-2 14:06 | 只看该作者
谢谢分享、、、
回复

使用道具 举报

板凳
ID:470848 发表于 2019-1-20 13:33 | 只看该作者
很不错
回复

使用道具 举报

地板
ID:537647 发表于 2019-5-15 16:20 | 只看该作者
没看懂。。。
回复

使用道具 举报

5#
ID:540349 发表于 2019-5-16 23:40 | 只看该作者
谢谢楼主,编程不容易
回复

使用道具 举报

6#
ID:537744 发表于 2019-5-17 13:57 | 只看该作者
谢谢分享!
回复

使用道具 举报

7#
ID:583076 发表于 2019-7-25 09:46 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

8#
ID:470428 发表于 2019-8-5 15:32 | 只看该作者
谢谢分享,下来学习,感觉讲的很详细
回复

使用道具 举报

9#
ID:620291 发表于 2019-10-8 00:06 | 只看该作者

谢谢楼主,编程不容易
回复

使用道具 举报

10#
ID:400671 发表于 2019-10-8 09:17 | 只看该作者

很不错
回复

使用道具 举报

11#
ID:783793 发表于 2020-6-20 11:09 | 只看该作者
感谢分享
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表