聚豐項目 > 智能遙控小車
小車是電子大賽常用的裝備,采用舵機轉向,兩個電機調速驅動的四輪小車,以前都是用ti’或stm32f1的板子做的,用RISC-V架構的芯片做一個小車的控制器應該沒問題。這里利用AB32VG1開發板做核心控制元件,用無線串口通信,實現小車的遙控。
OK起飛蕪湖
分享OK起飛蕪湖
團隊成員
OK起飛蕪湖 學生
硬件部分主要包括以下三部分:
(1) 主控裝置:AB32VG1開發板
(2) 驅動裝置:四路(兩路)電機驅動模塊
(3)遙控通信:HC-HID
1.AB32VG1開發板
(1)開發平臺:RT-Thread Studio
(2)組態配置
比例閥主要是采用PWM電流驅動,采用閉環控制可以提高控制精度,所以組態配置中使能PWM信號和ADC0通道。此外,在PWM信號上疊加震顫能提高比例閥的動態響應,降低滯環,所以使能了硬件定時器timer。
(3)主要代碼
①舵機控制
?? int sg(int argc, char *argv[])
{
period1 = 10000000; /* 周期為10ms,單位為納秒ns */
pulse1 = 0; /* PWM脈沖寬度值,單位為納秒ns */
/* 設置LED引腳腳模式為輸出 */
rt_pin_mode(SG_PIN_NUM, PIN_MODE_OUTPUT);
/* 拉高LED引腳 */
rt_pin_write(SG_PIN_NUM, PIN_HIGH);
/* 查找設備 */
pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);
if (pwm_dev == RT_NULL)
{
rt_kprintf("steering gear control run failed! can't find %s device!\n", PWM_DEV_NAME);
return RT_ERROR;
}
/* 設置PWM周期和脈沖寬度默認值 */
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period1, pulse1);
/* 使能設備 */
rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);
if(argc <2)
{
/* 由0度到180度,然后由180度到0度,循環運行5個周期 */
t1 = 50;
while (--t1)
{
rt_thread_mdelay(1000);
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period1, period1-500000);
rt_thread_mdelay(5000);
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period1, period1-2500000);
}
}
else
{
/*將msh輸入的字符轉換為數值*/
pulse1 = Ascii2Hex(argv[1],strlen(argv[1]));
/* 計算舵機目標位置所需要的高電平脈沖寬度 */
t1 = 2000000/180*pulse1;
pulse1 = period1-500000-t1; //pwm設定的占空比為低電平寬度,舵機控制使用高電平寬度控制旋轉角度
/* 設置PWM周期和脈沖寬度 */
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period1, pulse1);
}
}
void set_ang(uint8_t ang) //period-500000 對應0° , period-2500000 對應180°, 90°對中,
{static rt_uint32_t ang_pulse;
ang_pulse=1500000+ang/90*100000;
pulse1=period1-ang_pulse;
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period1, pulse1);
}
②行走電機驅動
int main(void)
{
uint8_t pin = rt_pin_get("PE.1");
rt_pin_mode(pin, PIN_MODE_OUTPUT);
uint8_t pin_dir1 = rt_pin_get("PA.0"); //電機方向控制
uint8_t pin_dir2 = rt_pin_get("PA.1"); //電機方向控制
rt_pin_mode(pin_dir1, PIN_MODE_OUTPUT);
rt_pin_mode(pin_dir2, PIN_MODE_OUTPUT);
rt_kprintf("Hello, world\n");
thread_serial1();
while (1)
{
rt_pin_write(pin, PIN_LOW);
rt_thread_mdelay(500);
rt_pin_write(pin, PIN_HIGH);
rt_thread_mdelay(500);
sg(0,"100000");
rt_thread_mdelay(1000);
tr(0,"2500000");
if(rec_ok==1) //收到命令
{
rec_ok=0;
if(rec_buf[1]=='L')// 左轉角度
{ang_l=(rec_buf[2]-0x30)*10 +(rec_buf[3]-0x30);}
rt_kprintf("ang_l%d",ang_l);
if(rec_buf[4]=='R')// 右轉角度
{ang_r=(rec_buf[5]-0x30)*10+(rec_buf[6]-0x30);}
rt_kprintf("ang_r%d",ang_r);
if(rec_buf[7]=='F')// 前進
{
rt_pin_write(pin_dir1, PIN_LOW);
rt_pin_write(pin_dir2, PIN_LOW);
}
if(rec_buf[7]=='N')// 空擋
{
rt_pin_write(pin_dir1, PIN_HIGH);
rt_pin_write(pin_dir2, PIN_HIGH);
}
if(rec_buf[7]=='R')// 后退
{
rt_pin_write(pin_dir1, PIN_LOW);
rt_pin_write(pin_dir2, PIN_HIGH);
}
if(rec_buf[7]=='T')// 剎車
{speed=0;
rt_pin_write(pin_dir1, PIN_HIGH);
rt_pin_write(pin_dir2, PIN_LOW);
}
speed=(rec_buf[8]-0x30)*10+(rec_buf[9]-0x30);
rt_kprintf("apeedl%d",speed);
clear_buf();
pwm_out(speed,speed);
if (ang_l>ang_r)
set_ang(-ang_l);
else {
set_ang(-ang_r);
}
}
}
}
通過串口調試助手發送小車控制命令,小車能實現前進、后退、左轉、右轉動作,也能控制小車的速度。
(0.36 MB)下載