访问下面的网站以及我给出的函数就可以看到设定的值f(x)和x直接的关系
f(x) = (0.01x^2)^2 (x < 58)
f(x) = (0.01(x-116)^2)^2 (58 <= x < 116)
接下来用在单片机中实现,因为单片机不能计算小树,所以我们需要将除数和被除数放大100倍
#define X_VARIABLE 70//设置分段函数的x轴边界值
#define DIVDEND 1 //设置微调比例的值,被除数
#define DIVISOR 100//设置微调比例的值,除数.通过两个的比值调节初期值变化,DIVDEND / DIVISOR的值越小,前期变化越慢
void mid_set_pwm_value(void)
{
static u16 count = 0;
u16 ret_pwm_value = 0;
if(count < X_VARIABLE)
{
ret_pwm_value = DIVDEND * (count * count) / DIVISOR;
ret_pwm_value *= ret_pwm_value;
}
else
{
ret_pwm_value = DIVDEND * (count - X_VARIABLE * 2) * (count - X_VARIABLE * 2) / DIVISOR;
ret_pwm_value *= ret_pwm_value;
if(count >= X_VARIABLE * 2)
{
count = 0;
}
}
TIM_SetCompare2(TIM3,ret_pwm_value);//设置PWM的大型
count++;
}