找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10624|回复: 18
收起左侧

电机位置闭环控制(STM32代码详细注释)

  [复制链接]
ID:529383 发表于 2019-5-7 11:45 | 显示全部楼层 |阅读模式
这是一个电机位置闭环控制(代码详细注释),很适合做伺服电机控制入门的同志们学习借鉴

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

  6. int main(void)
  7. {
  8.         Stm32_Clock_Init(9);            //系统时钟设置
  9.         delay_init(72);                 //延时初始化
  10.         LED_Init();                     //初始化与 LED 连接的硬件接口
  11.         uart_init(72,115200);           //初始化串口1
  12.         MiniBalance_PWM_Init(7199,0);   //=====初始化PWM 10KHZ 高频可以防止电机低频时的尖叫声
  13.         Encoder_Init_TIM2();            //初始化编码器
  14.   Timer3_Init(99,7199);           //=====10MS进一次中断服务函数,中断服务函数在control.c
  15.         while(1)
  16.                 {
  17.                         printf("Encoder:%d Position:%d \r\n",Encoder,Position);       
  18.                 }
  19. }
复制代码
  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. }

复制代码


所有资料51hei提供下载:
电机位置闭环控制(代码详细注释).7z (122.31 KB, 下载次数: 361)

评分

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

查看全部评分

回复

使用道具 举报

ID:118693 发表于 2019-5-22 20:31 | 显示全部楼层
感谢楼主的分享,谢谢
回复

使用道具 举报

ID:509721 发表于 2019-5-23 11:31 | 显示全部楼层
不能用标准库函数来实现么,非用操作寄存器
回复

使用道具 举报

ID:364795 发表于 2019-7-15 15:48 | 显示全部楼层
我咋发现这论坛啥都有
回复

使用道具 举报

ID:421451 发表于 2019-8-7 14:16 | 显示全部楼层
还以为里面有PID的呢。。。
回复

使用道具 举报

ID:439195 发表于 2019-8-7 16:05 | 显示全部楼层
认真学习技术上的知识,给论坛创造一个良好的氛围是很必要的
回复

使用道具 举报

ID:441868 发表于 2019-8-14 15:38 | 显示全部楼层
没看明白是如何计算位置
回复

使用道具 举报

ID:482834 发表于 2019-8-14 20:54 | 显示全部楼层
谢谢分享!学习一下~~~
回复

使用道具 举报

ID:401949 发表于 2019-10-5 11:26 | 显示全部楼层

谢谢分享!学习一下~~~
回复

使用道具 举报

ID:490458 发表于 2019-10-5 14:26 | 显示全部楼层
谜鹿 发表于 2019-8-7 14:16
还以为里面有PID的呢。。。

位置控制没有用pid的
回复

使用道具 举报

ID:613963 发表于 2019-12-29 14:53 | 显示全部楼层
十分感谢楼主的分享,谢谢
回复

使用道具 举报

ID:475945 发表于 2020-1-31 00:03 | 显示全部楼层
谢谢分享!学习一下~~~
回复

使用道具 举报

ID:260931 发表于 2020-4-27 07:12 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:202693 发表于 2020-5-15 23:05 来自手机 | 显示全部楼层
没什么用的
回复

使用道具 举报

ID:800205 发表于 2020-7-9 10:02 | 显示全部楼层
感谢楼主的分享,如果能加上PID的调整方法就更好了,谢谢
回复

使用道具 举报

ID:425723 发表于 2020-7-22 16:31 | 显示全部楼层
并不是FOC的控制算法,感觉就是个直流电机,位置输出直接给GPIO寄存器???还能有点东西吗
回复

使用道具 举报

ID:411668 发表于 2020-7-27 16:37 | 显示全部楼层
感谢分享,注释很全,代码可读性还比较强!
只是自己电机方面实在较菜,其它不敢点评。
回复

使用道具 举报

ID:58925 发表于 2020-8-1 14:58 | 显示全部楼层
shenchaobiao 发表于 2019-10-5 14:26
位置控制没有用pid的

有PID 控制,在 BALANCE 文件里面的 control.C
回复

使用道具 举报

ID:844901 发表于 2020-11-17 15:57 | 显示全部楼层
没有用
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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