项目场景:
项目场景:代码中写了S型加减速算法,相查看生成的加减速数组,直观的展示出来,USB通信一次64字节,对于我几个个32位的频率值不太方便,于是采用Excel进行仿真。
代码中如何生成S加减速曲线数组?
这是原理:传送门
不再过多赘述,本文要点在于仿真。
这是我用代码复现:
使用2种曲线对比效果
uint32_t CurveS_Para[100]={0}; //频率列表
/*
正常版
*pbuff 存放S曲线的脉冲对应 ARR寄存器的值
fre_max 最大频率
fre_min 起始频率
count 需要加速次数
*/
void CurveS_init_1(uint32_t *pbuff,uint32_t fre_max, uint32_t fre_min,int16_t count)
{
int16_t i;
uint16_t flexible =4;//曲线区间4-6
float del_fre = fre_max-fre_min;
float deno;
float melo;
float fre;
for(i = 0;i<count;i++)
{
melo = flexible* (i-count/2.0f) / (count/2.0f);
deno = 1.0f / (1 + expf(-melo));
fre = del_fre * deno + fre_min;
pbuff[i] = (uint32_t)ceil((float)TIM1_CLOCK_FREQ/fre);
}
}
/*
平移拉伸版
*/
void CurveS_init_2(uint32_t *pbuff,uint32_t fre_max, uint32_t fre_min,int16_t count)
{
int16_t i;
float del_fre = fre_max-fre_min;
float deno;//分母部分
float melo;//指数函数自变量
float fre;
for(i = 0;i<count;i++)
{
melo = ((-i*14.0f) /count)+7.0f;
deno = 1.0f / (1.0f + expf(melo));
fre = del_fre * deno + fre_min;
pbuff[i] = (uint32_t)ceil((float)TIM1_CLOCK_FREQ/fre);
}
}
Excel如何实现上述仿真:
- 代码中有循环,在Excel中某列输入顺序数,右下角下拉,生成需要的数组个数。
- 第二列编辑公式,保存后下拉。
正常版:=CEILING.MATH((495001)/(1+EXP(-4((A1-50)/50)))+500)
拉伸版:=CEILING.MATH((49500)/(1+EXP((-14*A1/100)+7))+500)
选中AB 或AC列生成散点图
- 修改名称
正常版:
拉伸版:
效果展示:
经过Excel仿真后,用这个数组在代码中对步进电机进行加减速控制。生成PWM波形如下:
- 百步加减速:
- 按比例20步加减速: