找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

帖子
查看: 3489|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

RISC-V MCU開(kāi)發(fā)實(shí)戰(zhàn)(四) :步進(jìn)電機(jī)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:809235 發(fā)表于 2021-10-29 13:48 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
軟件平臺(tái): MounRiver Studio(MRS),硬件平臺(tái): CH32V103開(kāi)發(fā)板、ULN2003步進(jìn)電機(jī)驅(qū)動(dòng)板、28BYJ-48步進(jìn)電機(jī),使用GPIO進(jìn)行步進(jìn)電機(jī)控制。

1.        ULN2003和28BYJ-48簡(jiǎn)介

ULN2003是高耐壓、大電流復(fù)合晶體管陣列,由七個(gè)硅NPN 復(fù)合晶體管組成,每一對(duì)達(dá)林頓都串聯(lián)一個(gè)2.7K 的基極電阻,在5V 的工作電壓下它能與TTL 和CMOS 電路直接相連,可以直接處理原先需要標(biāo)準(zhǔn)邏輯緩沖器來(lái)處理的數(shù)據(jù)。
ULN2003是大電流驅(qū)動(dòng)陣列,多用于單片機(jī)、智能儀表、PLC、數(shù)字量輸出卡等控制電路中�?芍苯域�(qū)動(dòng)繼電器等負(fù)載。
輸入5VTTL電平,輸出可達(dá)500mA/50V。

ULN2003是高耐壓、大電流達(dá)林頓系列,由七個(gè)硅NPN達(dá)林頓管組成。 該電路的特點(diǎn)如下: ULN2003的每一對(duì)達(dá)林頓都串聯(lián)一個(gè)2.7K的基極電阻,在5V的工作電壓下它能與TTL和CMOS電路 直接相連,可以直接處理原先需要標(biāo)準(zhǔn)邏輯緩沖器來(lái)處理的數(shù)據(jù)。

關(guān)于步進(jìn)電機(jī),此處所用電機(jī)型號(hào)為28BYJ-48(步進(jìn)電機(jī)),減速比為1:64,步進(jìn)腳為5.625/64度,如果需要轉(zhuǎn)動(dòng)轉(zhuǎn)動(dòng)一圈,那么需要 360/5.625*64=4096 個(gè)脈沖信號(hào)。

步進(jìn)電機(jī)是一種將電脈沖轉(zhuǎn)化為角位移的執(zhí)行設(shè)備。步進(jìn)電機(jī)驅(qū)動(dòng)信號(hào)為脈沖信號(hào),當(dāng)步進(jìn)驅(qū)動(dòng)器接收到一個(gè)脈沖信號(hào),它就驅(qū)動(dòng)步進(jìn)電機(jī)按設(shè)定的方向轉(zhuǎn)動(dòng)一個(gè)固定的角度(即步進(jìn)角)。

我們可以通過(guò)控制脈沖個(gè)數(shù)來(lái)控制角位移量,從而達(dá)到準(zhǔn)確定位的目的;同時(shí)我們可以通過(guò)控制脈沖頻率來(lái)控制電機(jī)轉(zhuǎn)動(dòng)的速度和加速度,從而達(dá)到調(diào)速的目的

2.        硬件連接
CH32V103開(kāi)發(fā)板與ULN2003步進(jìn)電機(jī)驅(qū)動(dòng)板的連接方式如下:
PB6連接驅(qū)動(dòng)板的IN1引腳
PB7連接驅(qū)動(dòng)板的IN2引腳
PB8連接驅(qū)動(dòng)板的IN3引腳
PB9連接驅(qū)動(dòng)板的IN4引腳

3.        MRS中開(kāi)發(fā)流程
1)首先新建一個(gè)CH32V103C8T6 的工程,這個(gè)要與對(duì)應(yīng)芯片對(duì)應(yīng)

上圖最下方紅框中是對(duì)選中芯片的資源的簡(jiǎn)單介紹,方便查詢

2) 新建完工程之后,我們打開(kāi)main.c文件,可以看到主函數(shù)只是一些初始化和串口打印,我們自己的主函數(shù)邏輯可以添加在打印下面就可以了;
3) 新建一個(gè)hardware的文件夾,右鍵工程new->folder,填寫(xiě)文件名,點(diǎn)擊finish即可,我們可以以同樣的方式在hardware目錄下再新建SD目錄,SPI目錄,條理清晰。
4) 在SPI目錄下,New>Source File,填寫(xiě)文件名gpio.c,內(nèi)容是電機(jī)初始化函數(shù)以及調(diào)速轉(zhuǎn)向停止函數(shù),在新建個(gè)gpio.h文件用來(lái)聲明函數(shù),這個(gè)新的頭文件需要添加到頭文件尋址路徑中,點(diǎn)擊菜單欄工程屬性配置按鈕,在彈出的頁(yè)面中,如下圖,點(diǎn)擊綠色加號(hào)添加路徑即可


驅(qū)動(dòng)代碼如下:
  1. #include "gpio.h"
  2. #include "debug.h"

  3. //#define N 4
  4. #define N 8

  5. //步進(jìn)電機(jī)正反轉(zhuǎn)數(shù)組  數(shù)組的值,即對(duì)應(yīng)GPIO引腳的值
  6. //單四拍
  7. //uint16_t phasecw[4] ={0x0200,0x0100,0x0080,0x0040};// D-C-B-A.(9-8-7-6)
  8. //uint16_t phaseccw[4]={0x0040,0x0080,0x0100,0x0200};// A-B-C-D.(6-7-8-9)

  9. ////雙四拍
  10. //uint16_t phasecw[4] ={0x0300,0x0180,0x00C0,0x0240};// DC-CB-BA-AD.
  11. //uint16_t phaseccw[4]={0x00C0,0x0180,0x0300,0x0240};// AB-BC-CD-DA.

  12. //四相八拍
  13. uint16_t phasecw[8] ={0x0200,0x0300,0x0100,0x0180,0x0080,0x00C0,0x0040,0x0240};// D-DC-C-CB-B-BA-A-AB.
  14. uint16_t phaseccw[8]={0x0040,0x00C0,0X0080,0x0180,0x0100,0x0300,0x0200,0x0240};// A-AB-B-BC-C-CD-D-DA.

  15. //電機(jī)初始化函數(shù)
  16. void Moto_Init(void)
  17. {
  18.     //步進(jìn)電機(jī)初始化
  19.     // IN1: PB6   a
  20.     // IN2: PB7   b
  21.     // IN3: PB8   c
  22.     // IN4: PB9   d
  23.     GPIO_InitTypeDef GPIO_InitStructure;
  24.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

  25.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 ;
  26.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  27.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  28.     GPIO_Init(GPIOB,&GPIO_InitStructure);

  29.     GPIO_ResetBits(GPIOB,GPIO_Pin_6 | GPIO_Pin_7 |GPIO_Pin_8 |GPIO_Pin_9 );
  30. }

  31. //電機(jī)正轉(zhuǎn)函數(shù)
  32. //其中,speed的值越大,速度越慢,值越小,速度越快,speed相當(dāng)于調(diào)節(jié)脈沖速度
  33. //轉(zhuǎn)動(dòng)速度和脈沖頻率成正比,在此處,延時(shí)越小,頻率越高
  34. void Motorcw(u8 speed)
  35. {
  36.     uint8_t i=0;

  37.     for(i=0;i<N;i++)
  38.     {
  39.         GPIO_Write(GPIOB,phasecw[i]);
  40.         Delay_Ms(speed);
  41.     }
  42. }

  43. //電機(jī)反轉(zhuǎn)函數(shù)
  44. void Motorccw(u8 speed)
  45. {
  46.     uint8_t i;
  47.     for(i=0;i<N;i++)
  48.     {
  49.         GPIO_Write(GPIOB,phaseccw[i]);
  50.         Delay_Ms(speed);
  51.     }
  52. }

  53. //電機(jī)停止函數(shù)
  54. void MotorStop(void)
  55. {
  56.     //GPIO_ResetBits(GPIOB,GPIO_Pin_6 | GPIO_Pin_7 |GPIO_Pin_8 |GPIO_Pin_9 );
  57.     GPIO_Write(GPIOB,0x0000);
  58. }

  59. //電機(jī)正轉(zhuǎn)角度
  60. void Motorcw_angle(int angle,int speed)
  61. {
  62.     int i,j;
  63.     j=(int)(angle/0.70312);
  64.     for(i=0;i<j;i++)
  65.     {
  66.         Motorcw(speed);
  67.     }
  68. }

  69. //電機(jī)反轉(zhuǎn)角度
  70. void Motorccw_angle(int angle,int speed)
  71. {
  72.     int i,j;
  73.     j=(int)(angle/0.70312);
  74.     for(i=0;i<j;i++)
  75.     {
  76.         Motorccw(speed);
  77.     }
  78. }
復(fù)制代碼


主函數(shù)可以調(diào)用我們驅(qū)動(dòng)中的正反轉(zhuǎn)函數(shù)來(lái)說(shuō)實(shí)現(xiàn)想要的功能

  1. int main(void)
  2. {

  3.     USART_Printf_Init(115200);
  4.     Moto_Init();
  5.     Delay_Init();

  6.     printf("This is Stepper motor driver\r\n");

  7.     Motorcw_angle(360,5);   //步進(jìn)電機(jī)正轉(zhuǎn)角度函數(shù)
  8.     MotorStop();
  9.     Delay_Ms(1000);

  10.     Motorccw_angle(360,5);  //步進(jìn)電機(jī)反轉(zhuǎn)角度函數(shù)
  11.     MotorStop();
  12.     Delay_Ms(1000);

  13. }
復(fù)制代碼

代碼編輯完成,點(diǎn)擊菜單欄編譯按鈕,在console窗口查看編譯結(jié)果,無(wú)錯(cuò)誤,就可以進(jìn)入到調(diào)試去驗(yàn)證邏輯,點(diǎn)擊菜單欄調(diào)試按鈕,如果運(yùn)行現(xiàn)象和理論不一致,可以通過(guò)左下角反匯編窗口,斷點(diǎn),外設(shè)寄存器,內(nèi)核寄存器這幾個(gè)窗口來(lái)配合查找邏輯BUG




小提示,當(dāng)程序運(yùn)行到 HardFault_Handler 函數(shù),可以觀察Rregister窗口的mepc,mtval,mcause三個(gè)寄存器,分別代表,進(jìn)入硬件錯(cuò)誤中斷前的pc,cpu取到的值,以及進(jìn)入異常的原因。

4.        驗(yàn)證
將編譯好的程序下載到開(kāi)發(fā)版并復(fù)位,通過(guò)邏輯分析儀對(duì)這幾個(gè)GPIO引腳進(jìn)行波形采集,具體如下圖。將開(kāi)發(fā)板、步進(jìn)電機(jī)驅(qū)動(dòng)板、步進(jìn)電機(jī)連接起來(lái),可看到電機(jī)進(jìn)行正反轉(zhuǎn)。


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:433219 發(fā)表于 2023-3-23 15:58 | 只看該作者
RISC-V  熱流......
回復(fù)

使用道具 舉報(bào)

板凳
ID:41271 發(fā)表于 2023-3-27 08:42 | 只看該作者
我剛接觸單片機(jī),單位的項(xiàng)目中用到RISC-V內(nèi)核的單片機(jī),8個(gè)引腳到16個(gè)引腳的,能多發(fā)一些這種單片機(jī)的學(xué)習(xí)資料嗎?謝謝
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表