完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
在原来的电机任务的基础上增加一个测量速度,修改pwm输出的任务,
通过PID 转速能稳定在 设定值范围 浮动, 速度高时候 抖动比较厉害,可能跟 pid 参数有关,或者电机的性能有关,而且声音也比较大,下一步学 foc 看 会不会比较静音 INT16U BLDC_PWM=0; INT32U gHallCnt=0; #define PWM_TEST (PWM_PAUSE-BLDC_PWM) void RunMotorTask(void) { INT8U hallcur,hallold=0xff; INT16U cnt=0; SysTick_CounterCmd(SysTick_Counter_Enable); //系统时钟开始计数 DcMotorTim1Init(PWM_PAUSE,1000); SetPinState(GPIOC,GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8,GPIO_Mode_IPU); OSQPost(OSQDebug,(void*)'0'); do{ OSTimeDly(1); hallcur=(GPIOC->IDR>>6)&0x07; if(hallcur!=hallold && hallcur!=0 && hallcur!=7) { hallold=hallcur; Hall2UVW[hallcur](); cnt=0; //记录脉冲数 ++gHallCnt; } if(++cnt>=OS_TICKS_PER_SEC/10) Hall2UVW[hallcur](); }while(1); } void PidTask(void *pdata) { //INT8U err; INT32U hallcnt=0,speed; S_PID pid; pid.target=60; pid.kp=200; pid.ki=20; pid.kd=80; pid.integral=0; do{ //计算单位时间内的脉冲数差值,就是速度 speed=gHallCnt-hallcnt; hallcnt+=speed; printf("%X %d %drn",BLDC_PWM,speed,pid.integral); //通过 pid 算法 获取pwm 的输出 BLDC_PWM=GetPid(speed,&pid); OSTimeDly(OS_TICKS_PER_SEC/10); }while(1); } PID算法如下 #define PID_DIV 100 typedef struct{ INT32S kp; //比例常数 INT32S ki; //积分常数 INT32S kd; //微分常数 INT32S target; //目标值 INT32S cur; //当前值 INT32S integral; //积分差值 INT32S offsetprev; //上次偏差值 }S_PID; INT32S GetPid(INT16S _newData,S_PID *pid) { INT32S ret; INT32S bias=pid->target-_newData; pid->cur=_newData; //记录当前值 pid->integral+=bias; ret=pid->kp*bias+pid->ki*pid->integral-pid->kd*(bias-pid->offsetprev); pid->offsetprev=bias; return ret/PID_DIV; } |
|
|
|
只有小组成员才能发言,加入小组>>
2386 浏览 0 评论
8910 浏览 4 评论
36486 浏览 19 评论
4981 浏览 0 评论
24307 浏览 34 评论
1375浏览 2评论
1627浏览 1评论
2017浏览 1评论
1441浏览 0评论
386浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 00:18 , Processed in 1.076309 second(s), Total 80, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号