完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
一.内容
结合程序,学习并理解相关函数的主要作用和实现方法。 二. 知识点 HALL状态的读取 u8 ReadHallState(void) { u8 ReadValue; #if defined(TIMER2_HANDLES_HALL) ReadValue= (u8)(GPIO_ReadInputData(GPIOA)); ReadValue = ReadValue & GPIO_MSK; #elif defined(TIMER3_HANDLES_HALL) ReadValue = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6); ReadValue |= GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7)<<1; ReadValue |= GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_8)<<2; ReadValue &=GPIO_MSK; #elif defined(TIMER4_HANDLES_HALL) ReadValue = ((u8)(GPIO_ReadInputData(GPIOA))>>6) & GPIO_MSK; #endif return(ReadValue); } HALL状态的读取理解起来还算简单,他是根据转子磁性输出数字量,一个霍HALL在一个电周期内只会输出两种状态,三个HALL就会形成6种状态(有两种状态不存在),对应SVPWM中6个扇区。 2. 电角度的计算 void HALL_Init_Electrical_Angle(void) { #if (HALL_SENSORS_PLACEMENT == DEGREES_120) switch(ReadHallState()) { case STATE_5: hElectrical_Angle =(s16(S16_PHASE_SHIFT+S16_60_PHASE_SHIFT/2); break; case STATE_1: hElectrical_Angle =(s16)(S16_PHASE_SHIFT+S16_60_PHASE_SHIFT+ S16_60_PHASE_SHIFT/2); break; case STATE_3: hElectrical_Angle=(s16)(S16_PHASE_SHIFT+S16_120_PHASE_SHIFT+ S16_60_PHASE_SHIFT/2);break; case STATE_2: hElectrical_Angle=(s16)(S16_PHASE_SHIFT-S16_120_PHASE_SHIFT- S16_60_PHASE_SHIFT/2); break; case STATE_6: hElectrical_Angle =(s16)(S16_PHASE_SHIFT-S16_60_PHASE_SHIFT- S16_60_PHASE_SHIFT/2); break; case STATE_4: hElectrical_Angle =(s16)(S16_PHASE_SHIFT-S16_60_PHASE_SHIFT/2); break; default:break; } #elif (HALL_SENSORS_PLACEMENT == DEGREES_60) switch(ReadHallState()) { case STATE_1: hElectrical_Angle =(s16)(S16_PHASE_SHIFT+S16_60_PHASE_SHIFT/2); break; case STATE_3: hElectrical_Angle =(s16)(S16_PHASE_SHIFT+S16_60_PHASE_SHIFT+ S16_60_PHASE_SHIFT/2); break; case STATE_7: hElectrical_Angle=(s16)(S16_PHASE_SHIFT+S16_120_PHASE_SHIFT+ S16_60_PHASE_SHIFT/2);break; case STATE_6: hElectrical_Angle =(s16)(S16_PHASE_SHIFT-S16_120_PHASE_SHIFT- S16_60_PHASE_SHIFT/2);break; case STATE_4: hElectrical_Angle =(s16)(S16_PHASE_SHIFT-S16_60_PHASE_SHIFT- S16_60_PHASE_SHIFT/2);break; case STATE_0: hElectrical_Angle =(s16)(S16_PHASE_SHIFT-S16_60_PHASE_SHIFT/2); break; default: break; } #endif } 在源文件中,定义了#define HALL_PHASE_SHIFT (s16) 90,来作为电机Hall A的上升沿到电机A相反电动势最高点的延迟角度为同步电角度,而后再根据HALL传感器获得不同的位置信息,来计算出各自位置的电角度。 3. Clarke_Park变化 Clark变化: Curr_Components Clarke(Curr_Components Curr_Input) { Curr_Components Curr_Output; s32 qIa_divSQRT3_tmp; s32 qIb_divSQRT3_tmp ; s16 qIa_divSQRT3; s16 qIb_divSQRT3 ; Curr_Output.qI_Component1= Curr_Input.qI_Component1; qIa_divSQRT3_tmp = divSQRT_3 * Curr_Input.qI_Component1; //电流平方根3 qIa_divSQRT3_tmp /=32768; qIb_divSQRT3_tmp = divSQRT_3 * Curr_Input.qI_Component2; qIb_divSQRT3_tmp /=32768; qIa_divSQRT3=((s16)(qIa_divSQRT3_tmp)); qIb_divSQRT3=((s16)(qIb_divSQRT3_tmp)); Curr_Output.qI_Component2=(-(qIa_divSQRT3)-(qIb_divSQRT3)-(qIb_divSQRT3)); return(Curr_Output); } 由之前的学习可以知道,Clark变化的计算公式是 在程序中,便是通过这两个公式来实现的 Curr_Output.qI_Component1= Curr_Input.qI_Component1; Curr_Output.qI_Component2=(-(qIa_divSQRT3)-(qIb_divSQRT3)-(qIb_divSQRT3)); 其中qIa_divSQRT3和qIb_divSQRT3分别是对和除以处理后的变量,从而实现了Clark变化。 Park变化: `Curr_Components Park(Curr_Components Curr_Input, s16 Theta) { Curr_Components Curr_Output; s32 qId_tmp_1, qId_tmp_2; s32 qIq_tmp_1, qIq_tmp_2; s16 qId_1, qId_2; s16 qIq_1, qIq_2; Vector_Components = Trig_Functions(Theta); qIq_tmp_1 = Curr_Input.qI_Component1 * Vector_Components.hCos; qIq_tmp_1 /= 32768; qIq_tmp_2 = Curr_Input.qI_Component2 *Vector_Components.hSin; qIq_tmp_2 /= 32768; qIq_1 = ((s16)(qIq_tmp_1)); qIq_2 = ((s16)(qIq_tmp_2)); Curr_Output.qI_Component1 = ((qIq_1)-(qIq_2)); qId_tmp_1 = Curr_Input.qI_Component1 * Vector_Components.hSin; qId_tmp_1 /= 32768; qId_tmp_2 = Curr_Input.qI_Component2 *Vector_Components.hCos; qId_tmp_2 /= 32768; qId_1 = (s16)(qId_tmp_1); qId_2 = (s16)(qId_tmp_2); Curr_Output.qI_Component2 = ((qId_1)+(qId_2)); return (Curr_Output); } 由Clark变化的输出Curr_Components(也就是和)来作为Park变化的输入。同样的,由之前的学习,可以容易地知道和和和之间存在的关系: 通过变化,我们就可以得到由和变化到和的公式: 在程序中的公式如下所示: Curr_Output.qI_Component1 = ((qIq_1)-(qIq_2)); Curr_Output.qI_Component2 = ((qId_1)+(qId_2)); 其中qIq_1是,qIq_2是,qId_1是,qId_2是,和计算得到的公式相符合。 三、学习总结 结合原理,能够大概明白这些主要函数的基本作用,但是对于函数的实现上,还有很多不明白的地方,对于一个函数而言,明白他的原理,也是能让自己有了基本的框架,要让这个函数能够正常运行,从而得到想要的返回值或者作用,还需要进一步的学习与理解。同时,还有部分程序,目前还没有理通,像PI调节程序的实现,里面共有PID_Torque, PID_Flux和PID_Speed调节,但是对于其中相关参数的意义暂时并不明白。这也是下期首先要解决的部分。 ———————————————— |
|
|
|
只有小组成员才能发言,加入小组>>
2434 浏览 0 评论
9099 浏览 4 评论
36771 浏览 19 评论
5025 浏览 0 评论
24743 浏览 34 评论
1527浏览 2评论
1742浏览 1评论
2192浏览 1评论
1552浏览 0评论
523浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 11:03 , Processed in 1.356589 second(s), Total 46, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号