#ifdef RT_USING_ADC1
#define ADC1_CONFIG \
{ \
.name = "adc1", \
.Instance = ADC1, \
}
#endif
#ifdef RT_USING_ADC2
#define ADC2_CONFIG \
{ \
.name = "adc2", \
.Instance = ADC2, \
}
#endif
struct rt_adc_drv *rt_find_adc(char *name);
rt_err_t rt_adc_enabled(struct rt_adc_drv *obj, rt_bool_t enabled);
rt_err_t rt_get_adc_value(struct rt_adc_drv *obj, rt_uint32_t channel, rt_uint32_t *value);
int rt_voltage_dev_init(void)
{
voltage_adc_drv = rt_find_adc("adc1");
if(voltage_adc_drv == RT_NULL)
{
rt_kprintf("find adc1 fail\n");
return RT_ERROR;
}
rt_adc_enabled(voltage_adc_drv, RT_TRUE);
return RT_EOK;
}
rt_uint32_t rt_get_voltage(void)
{
rt_uint32_t vol = 0;
rt_uint32_t value = 0;
rt_get_adc_value(voltage_adc_drv, VOLTAGE_ADC_CHANNEL, &value);
vol = (value * REFER_VOLTAGE / CONVERT_BITS) * 11;
rt_kprintf("the voltage is :%d.%02d \n", vol / 100, vol % 100);
return value;
}
static void ctrl_thread_entry(void *parameter)
{
for(;;)
{
ctrl_get_angle(); //获取角度
ctrl_balance_pid(); //平衡PID计算
ctrl_get_speed(); //获取当前速度
ctrl_speed_pid(); //速度PID计算
ctrl_turn_pid(); //转向PID计算
ctrl_set_speed(); //控制速度
rt_thread_delay(5);
}
}
turn_parm.turn_gyor = gyro.z / 16.384;
angle_parm.balance_gyor = gyro.y / 16.384;
angle_parm.angle = atan2(accel.x, accel.z) * 180 / PI;
angle_parm.angle_increment = angle_parm.out_angle - (gyro.y / 16.384) * 0.005;
angle_parm.out_angle = K1 * angle_parm.angle + (1 - K1)*(angle_parm.angle_increment);
int ctrl_balance_pid(void)
{
float bias_val = 0.0;
bias_val = (car_parm.blc_angle - 0.5) - angle_parm.out_angle;
speed_parm.balance_pwm = car_parm.blc_Kp * bias_val + car_parm.blc_Kd * angle_parm.balance_gyor;
return speed_parm.balance_pwm;
}
void ctrl_speed_pid(void)
{
float current_bias = 0;
current_bias = (speed_parm.get_left_speed + speed_parm.get_right_speed) - car_parm.speed;
current_bias = speed_parm.last_bias * 0.3 + current_bias * 0.7;
speed_parm.integral_bias += current_bias;
speed_parm.speed_pwm = (int)(car_parm.speed_Kp * current_bias +
car_parm.speed_Ki * speed_parm.integral_bias);
speed_parm.last_bias = current_bias;
}
http://mpvideo.qpic.cn/0bf2maaaaaaa2yac3ryqlzqfaygdabqaaaaa.f10002.mp4?dis_k=b09a68cde9e9da40d677c12c747eaad0&dis_t=1652175861&vid=wxv_1712630676849491971&format_id=10002&support_redirect=0&mmversion=false
本文分享自 Rice 嵌入式开发技术分享 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!