这是一个电机位置闭环控制(代码详细注释),很适合做伺服电机控制入门的同志们学习借鉴
单片机源程序如下:
- #include "sys.h"
- u8 Flag_Stop=1; //停止标志位
- int Encoder,Position=10000; //编码器的脉冲计数
- long SHOW;
- int Moto1; //电机PWM变量 应是Motor的 向Moto致敬
- int main(void)
- {
- Stm32_Clock_Init(9); //系统时钟设置
- delay_init(72); //延时初始化
- LED_Init(); //初始化与 LED 连接的硬件接口
- uart_init(72,115200); //初始化串口1
- MiniBalance_PWM_Init(7199,0); //=====初始化PWM 10KHZ 高频可以防止电机低频时的尖叫声
- Encoder_Init_TIM2(); //初始化编码器
- Timer3_Init(99,7199); //=====10MS进一次中断服务函数,中断服务函数在control.c
- while(1)
- {
- printf("Encoder:%d Position:%d \r\n",Encoder,Position);
- }
- }
复制代码- #include "motor.h"
- void MiniBalance_Motor_Init(void)
- {
- RCC->APB2ENR|=1<<3; //PORTB时钟使能
- GPIOB->CRH&=0X0000FFFF; //PORTB12 13 14 15推挽输出
- GPIOB->CRH|=0X22220000; //PORTB12 13 14 15推挽输出
- }
- void MiniBalance_PWM_Init(u16 arr,u16 psc)
- {
- MiniBalance_Motor_Init(); //初始化电机控制所需IO
- RCC->APB2ENR|=1<<11; //使能TIM1时钟
- RCC->APB2ENR|=1<<2; //PORTA时钟使能
- GPIOA->CRH&=0XFFFF0FF0; //PORTA8 11复用输出
- GPIOA->CRH|=0X0000B00B; //PORTA8 11复用输出
- TIM1->ARR=arr; //设定计数器自动重装值
- TIM1->PSC=psc; //预分频器不分频
- TIM1->CCMR2|=6<<12; //CH4 PWM1模式
- TIM1->CCMR1|=6<<4; //CH1 PWM1模式
- TIM1->CCMR2|=1<<11; //CH4预装载使能
- TIM1->CCMR1|=1<<3; //CH1预装载使能
- TIM1->CCER|=1<<12; //CH4输出使能
- TIM1->CCER|=1<<0; //CH1输出使能
- TIM1->BDTR |= 1<<15; //TIM1必须要这句话才能输出PWM
- TIM1->CR1=0x8000; //ARPE使能
- TIM1->CR1|=0x01; //使能定时器1
- }
复制代码
所有资料51hei提供下载:
电机位置闭环控制(代码详细注释).7z
(122.31 KB, 下载次数: 361)
|