0 前言
?? 這兩年開(kāi)始畢業(yè)設(shè)計(jì)和畢業(yè)答辯的要求和難度不斷提升,傳統(tǒng)的畢設(shè)題目缺少創(chuàng)新和亮點(diǎn),往往達(dá)不到畢業(yè)答辯的要求,這兩年不斷有學(xué)弟學(xué)妹告訴學(xué)長(zhǎng)自己做的項(xiàng)目系統(tǒng)達(dá)不到老師的要求。
為了大家能夠順利以及最少的精力通過(guò)畢設(shè),學(xué)長(zhǎng)分享優(yōu)質(zhì)畢業(yè)設(shè)計(jì)項(xiàng)目,今天要分享的是
?? 基于單片機(jī)的自動(dòng)寫(xiě)字機(jī)器人設(shè)計(jì)與實(shí)現(xiàn)
??學(xué)長(zhǎng)這里給一個(gè)題目綜合評(píng)分(每項(xiàng)滿(mǎn)分5分)
- 難度系數(shù):3分
- 工作量:3分
- 創(chuàng)新點(diǎn):5分
1 簡(jiǎn)介
基于RTthread的寫(xiě)字機(jī)控制系統(tǒng),采用獨(dú)立研發(fā)的運(yùn)動(dòng)控制系統(tǒng),結(jié)合RTT的多線(xiàn)程,將運(yùn)動(dòng)控制分解,速度前饋、折線(xiàn)速度平滑優(yōu)化。AB32VG1開(kāi)發(fā)板作為UI交互和sd卡gc文件讀取,采用串口將運(yùn)動(dòng)命令發(fā)送給STM32。STM32負(fù)責(zé)將串口接收到的G命令進(jìn)行解析,運(yùn)動(dòng)計(jì)算、控制輸出P合適的PWM頻率和脈沖個(gè)數(shù)給4個(gè)電機(jī)。運(yùn)動(dòng)控制算法完全獨(dú)立創(chuàng)作。 Halo項(xiàng)目是我9月初時(shí)候的一個(gè)自研3D打印機(jī)的固件,前期在工作中接觸到Marlin(一款優(yōu)秀的開(kāi)源3D打印固件,提供了豐富的擴(kuò)展功能,擁有完整成熟的生態(tài)),遂想自研一款基于國(guó)產(chǎn)芯片和操作系統(tǒng)的3D打印系統(tǒng),能提供在咱國(guó)產(chǎn)的芯片中方便移植與運(yùn)行,提供3D打印所需的所有功能,降低硬件成本和軟件適配成本。
2 主要器件
- STM32F4單片機(jī)
- AB32VG1單片機(jī)
- RT-Thread物聯(lián)網(wǎng)操作系統(tǒng)
- SD卡文件讀取與發(fā)送
- 速度前饋、折角優(yōu)化、加速處理等算法
3 實(shí)現(xiàn)效果
4 硬件設(shè)計(jì)
總體框架
AB32V負(fù)責(zé)GUI和SD卡文件,STM32負(fù)責(zé)運(yùn)動(dòng)控制
最初設(shè)想是采用兩塊AB32的板子,一個(gè)負(fù)責(zé)GUI人機(jī)交互和SD卡文件讀取與發(fā)送,一塊負(fù)責(zé)接收Gcode命令,完成速度前饋、折角優(yōu)化、加速處理等算法,實(shí)現(xiàn)完整的運(yùn)動(dòng)控制算法。但實(shí)際在AB32上跑控制時(shí),發(fā)現(xiàn)浮點(diǎn)運(yùn)算會(huì)導(dǎo)致異常的問(wèn)題,同時(shí)打印日志都經(jīng)常遇到棧溢出導(dǎo)致系統(tǒng)崩潰,因此將運(yùn)動(dòng)控制算法移植到STM32F4的板子上運(yùn)行,控制效果良好。
AB32VG1主控MCU
簡(jiǎn)介
開(kāi)發(fā)板采用中科藍(lán)訊的32位RISC-V指令集的AB32VG1型號(hào)MCU,主頻120M。MCU有8M的Flash,和192K SRAM。支持3.0V-5.0V供電。
與一般MCU不同的是,這款MCU具有MPU模塊,就是電源管理模塊,支持Charge電路、BUCK電路、LDO電路等等,手冊(cè)第十頁(yè)給出了MPU模塊的詳細(xì)參數(shù)。
開(kāi)發(fā)環(huán)境搭建
根據(jù)官方的指導(dǎo),使用的是RT-thread官方stduio平臺(tái),先更新軟件源代碼至最新版,下載中科藍(lán)訊軟件包,下載RISC-V-GCC工具鏈,編譯程序會(huì)用到。
軟件包配置
接下來(lái)選擇我們本次實(shí)驗(yàn)用到的軟件包,wavplayer軟件包、optparse軟件包和multibutton軟件包,實(shí)現(xiàn)通過(guò)板載按鍵控制聲音的播放語(yǔ)音量的增減。
然后對(duì)軟件包進(jìn)行簡(jiǎn)單配置,按鍵的示例代碼可以勾選也可以不勾選,后面要對(duì)此進(jìn)行修改,改為評(píng)測(cè)板上的用戶(hù)按鍵,optparse軟件包默認(rèn)即可。
5 軟件說(shuō)明
總體框架
代碼樹(shù)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-811779.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-811779.html
6 部分核心代碼
int main(void)
{
rt_thread_mdelay(1000);
serial_thread_init(NULL);
while(1){
//debug_error("Insufficient system memory");
while(refresh_file_names("/") == 0){
rt_thread_mdelay(1000);
}
uart_lcd_thread_init();
rt_thread_mdelay(100);
gui_into_print_list(NULL);
while(1){
rt_thread_mdelay(1000);;
}
}
g_gcode_ringbuff = ringbuff_create(sizeof(uint8_t), 4096);
if(g_gcode_ringbuff == NULL){
debug_error("Insufficient system memory");
while(1);
}
while(1){
rt_thread_mdelay(1000);
debug_info("rt - thread\r\n");
}
while (1)
{
list_cur_dir_files("/");
if(dfs_file_open(&s_fd, get_cur_dif_file_name(0), O_RDONLY) < 0){
debug_info("open file %s error", get_cur_dif_file_name(0));
continue;
}
debug_info("open file %s ok", get_cur_dif_file_name(0));
int read_bytes;
uint8_t buff[512];
int idx = 0;
do{
memset(buff, 0, sizeof(buff));
read_bytes = dfs_file_read(&s_fd, buff, sizeof(buff));
while(ringbuff_remin(g_gcode_ringbuff) < read_bytes){
rt_thread_yield();
}
for(int i = 0; i < read_bytes; i++){
ringbuff_push(g_gcode_ringbuff, &buff[i]);
}
}while(read_bytes > 0);
dfs_file_close(&s_fd);
}
return RT_EOK;
}
/* 定時(shí)器超時(shí)回調(diào)函數(shù) */
#if (defined SOC_AB32VG1)
RT_SECTION(".irq.timer")
#endif
static rt_err_t step_run_schdule(rt_device_t dev, rt_size_t size)
{
extern motion_control_t *motion_control;
if((motion_control->motion_step_z.ops->is_motion(&(motion_control->motion_step_z)) == true) ||
(ringbuff_is_empty(motion_control->motion_step_z.step_drv->pulse_list) == false)){
motion_control->motion_step_z.step_drv->ops-> \
timer_schdule(motion_control->motion_step_z.step_drv);
return RT_EOK;
}
motion_control->motion_step_x.step_drv->ops-> \
timer_schdule(motion_control->motion_step_x.step_drv);
motion_control->motion_step_y.step_drv->ops-> \
timer_schdule(motion_control->motion_step_y.step_drv);
motion_control->motion_step_y_1.step_drv->ops-> \
timer_schdule(motion_control->motion_step_y_1.step_drv);
return RT_EOK;
}
/* 初始化擠出機(jī) */
void fdm_extruder_init(void)
{
if(false == temperature_register(&s_temperature_ntc, temperature_type_ntc)){
return;
}
/* 初始化傳感器接口 */
if(false == temperature_init(&s_temperature_ntc, /* 描述符 */
TEMPERATURE_NTC_ADC_DEV_NAME, /* 驅(qū)動(dòng)名稱(chēng) */
TEMPERATURE_NTC_ADC_DEV_CHANNEL, /* 通道號(hào) */
12, /* adc精度 */
ntc_mode_zm_1460, /* ntc傳感器型號(hào) */
4700)){ /* 上拉電阻阻值 */
}
}
void fdm_printer_test(void)
{
/* 初始化所有的溫度傳感器 */
//fdm_extruder_init();
rt_pin_mode(49, PIN_MODE_OUTPUT);
rt_pin_write(49, PIN_HIGH);
#if 0
heater_t *heater;
heater = heater_create(pid_type_position);
/* 設(shè)置pid的三個(gè)參數(shù),輸出最大、最小值 */
heater->pid->ops->init(heater->pid, 0.5, 0.5, 1, 100, 0);
/* 設(shè)置調(diào)節(jié)的目標(biāo)值 */
heater->pid->ops->target_set(heater->pid, 30);
/* 綁定溫度傳感器,設(shè)置pid的計(jì)算周期 */
heater->ops->init(heater, 1, true, 3000, &s_temperature_ntc);
/* 開(kāi)始軟件定時(shí)器 */
heater->ops->start(heater);
#endif
hard_task_t *hard_task;
/* 創(chuàng)建硬實(shí)時(shí)任務(wù)對(duì)象 */
hard_task = hard_task_creater();
hard_task->ops->init(hard_task, STEP_SCHDULE_HWTIMER_DEV_NAME,
STEP_SCHDULE_TIMER_FREQ);//
hard_task->ops->set_run(hard_task, step_run_schdule);
hard_task->ops->start(hard_task, STEP_SCHDULE_FREQ);
}
7 最后
到了這里,關(guān)于stm32畢設(shè)分享 單片機(jī)自動(dòng)寫(xiě)字機(jī)器人設(shè)計(jì)與實(shí)現(xiàn) - 物聯(lián)網(wǎng) 嵌入式 stm32的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!