| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- #ifndef _FOC_H__
- #define _FOC_H__
- #include "math/fix_math.h"
- #include "foc/core/PI_Controller.h"
- #include "foc/lineramp.h"
- typedef struct {
- float a;
- float b;
- }albt_t;
- typedef struct {
- float d;
- float q;
- }dq_t;
- typedef struct {
- float curr_abc[3];
- albt_t curr_ab;
- float vol_abc[3]; //相对地电压
- float mot_velocity; //from hall or encoder
- float mot_angle; //from hall or encoder
- lineramp_t target_id;
- lineramp_t target_iq;
- dq_t target_vol_dq;
- float dc_vol;
- bool b_openloop;
- }foc_in_t;
- typedef struct {
- u16 duty[3];
- u16 low_duty;
- u16 mid_duty;
- u8 sector;
- u8 sample_phase;
- u16 sample1;
- u16 sample2;
- dq_t vol_dq;
- dq_t curr_dq;
- albt_t vol_albeta;
- }foc_out_t;
- typedef struct {
- foc_in_t in;
- foc_out_t out;
- float mot_velocity_filterd; //电机滤波后的转速
- float mot_vel_radusPers; //电机的电角速度
- float ts;
- float sin;
- float cos;
- u32 half_period;
- PI_Controller daxis;
- PI_Controller qaxis;
- }foc_t;
- void foc_init(foc_t *foc);
- void foc_update(foc_t *foc);
- void foc_abc_2_dq(float a, float b, float c, float *d, float *q);
- static __INLINE void foc_set_target_idq(foc_t *foc, dq_t *idq) {
- line_ramp_set_target(&foc->in.target_id, idq->d);
- line_ramp_set_target(&foc->in.target_iq, idq->q);
- }
- static __INLINE void clark(float A, float B, float C, albt_t *alpha_beta){
- alpha_beta->a = A;
- alpha_beta->b = ONE_BY_SQRT3 * (B - C);
- }
- static __INLINE void rev_clark(albt_t *alpha_beta, float *ABC){
- ABC[0] = alpha_beta->a;
- ABC[1] = -alpha_beta->a * 0.5f + alpha_beta->b * SQRT3_BY_2;
- ABC[2] = -alpha_beta->a * 0.5f - alpha_beta->b * SQRT3_BY_2;
- }
- static __INLINE void rev_park(foc_t *foc, dq_t *dq, albt_t *alpha_beta) {
- float c,s;
- s = foc->sin;
- c = foc->cos;
- alpha_beta->a = dq->d * c - dq->q * s;
- alpha_beta->b = dq->d * s + dq->q * c;
- }
- static __INLINE void park(foc_t *foc, albt_t *alpha_beta, dq_t *dq) {
- float c,s;
- s = foc->sin;
- c = foc->cos;
- dq->d = alpha_beta->a * c + alpha_beta->b * s;
- dq->q = -alpha_beta->a * s + alpha_beta->b * c;
- }
- #endif /* _FOC_H__ */
|