MotorDriver_upgrade 带过流监测.rar
(4.1 MB, 售价: 3 E币)
部分源码如下,完整工程源码见附件
- #include "main.h"
- extern unsigned char rx_buffer[10];
- extern u8 rx_received;
- extern u8 TIM2Timeout;
- extern u8 MotorState;
- extern s16 MotorPWM;
- extern int MotorSpeed;
- extern u8 ExceedCurrentCounter;
- int MotorPWM_Para=0;//调试用
- float MotorSetSpeed=0;//需要的转速(rpm,-MOTORMAXRPM~MOTORMAXRPM)
- u16 TIM2Counter=0;//TIM2溢出计数器,范围0~399,对应时间0~1s
- int MotorSpeed_Debug=0;
- u16 MotorCurrentADValue=0;
- int main(void)
- {
- LED_Configuration();
- LED_RED_ON();
- PWM_Configuration();
- KEY_Configuration();
- USART2_Configuration();
- Encoder_Configuration();
- TIM2_Configuration();
- ADC_Configuration();
- TIM2_Start();
- Encoder_Start();
- MotorControlInit();
- while(1)
- {
- if(TIM2Timeout==1)//处理定时器2溢出事件,周期2.5ms
- {
- MotorSpeed+=Encoder_Get_CNT();//读取码盘数据
- if(MotorState==3)//过流保护状态指示,当第一次发生过流时,红灯闪烁(周期400ms),将转速设定值降为0以解除过流保护状态
- {
- MotorSetPWM(0);//电机停转
- if(TIM2Counter%80==0 && ExceedCurrentCounter==1)//1次过流保护状态红灯闪烁
- LED_RED_TOGGLE();
- if(ExceedCurrentCounter==2)//当第二次发生过流时,红灯闪烁(周期1.2s),电机驱动器锁死,只能复位或重新上电以解除过流保护
- while(1)
- {
- delay_ms(600);
- LED_RED_TOGGLE();
- }
- if(MotorSetSpeed==0 && ExceedCurrentCounter==1 && MotorCurrentCheck(ADC_Filter())==0)//将转速设为0,且此时不过流,则解除1次过流保护状态
- {
- MotorState=0;
- LED_RED_ON();
- MotorControlReset();//电机控制复位
- MotorSpeed=0;//反馈转速也清0
- }
-
- }
- else//不在过流保护状态才进行电机控制
- {
- if(TIM2Counter%2==0)//每5ms进行一次PID控制
- {
- MotorSpeed/=2;
- MotorSpeed_Debug=MotorSpeed;
- MotorControl(MotorSetSpeed,0.7426*MotorSpeed); //读出的数据除以260(码盘倍率),再除以16(减速箱比),即为输出轴的转速r/s,乘以60即得rpm
- MotorSpeed=0;
- }
- }
- if(TIM2Counter%40==0)//每100ms发送一次数据,以及电流检测
- {
- MotorCurrentADValue=ADC_Filter();
- MotorCurrentCheck(MotorCurrentADValue);
- printf("%.2f %.4f %d %d\r\n",MotorSetSpeed,0.7426*MotorSpeed_Debug,MotorPWM,MotorCurrentADValue);
- }
-
-
- TIM2Counter=(TIM2Counter+1)%400;//计数器加1
- TIM2Timeout=0;//溢出事件处理完毕
- }
- if(rx_received==1)//处理串口发来的数据信息
- {
- if(strncmp((const char*)rx_buffer,"boostmotor",10)==0)//电机增速
- {
- MotorSetSpeed+=50;
- MotorSetSpeed=MotorSpeedLegalize(MotorSetSpeed);
- }
- if(strncmp((const char*)rx_buffer,"slackmotor",10)==0)//电机减速
- {
- MotorSetSpeed-=50;
- MotorSetSpeed=MotorSpeedLegalize(MotorSetSpeed);
- }
-
- rx_received=0;//串口数据处理完毕
- }
- }
复制代码
【必读】版权免责声明
1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
|