軟件平台: MounRiver Studio(MRS),硬件平台: CH32V103開發板、ULN2003步進電機驅動板、28BYJ-48步進電機,使用GPIO進行步進電機控制。
1. ULN2003和28BYJ-48簡介
ULN2003是高耐壓、大電流復合晶體管陣列,由七個硅NPN 復合晶體管組成,每一對達林頓都串聯一個2.7K 的基極電阻,在5V 的工作電壓下它能與TTL 和CMOS 電路直接相連,可以直接處理原先需要標准邏輯緩沖器來處理的數據。
ULN2003是大電流驅動陣列,多用於單片機、智能儀表、PLC、數字量輸出卡等控制電路中。可直接驅動繼電器等負載。
輸入5VTTL電平,輸出可達500mA/50V。
ULN2003是高耐壓、大電流達林頓系列,由七個硅NPN達林頓管組成。 該電路的特點如下: ULN2003的每一對達林頓都串聯一個2.7K的基極電阻,在5V的工作電壓下它能與TTL和CMOS電路 直接相連,可以直接處理原先需要標准邏輯緩沖器來處理的數據。
關於步進電機,此處所用電機型號為28BYJ-48(步進電機),減速比為1:64,步進腳為5.625/64度,如果需要轉動轉動一圈,那么需要 360/5.625*64=4096 個脈沖信號。
步進電機是一種將電脈沖轉化為角位移的執行設備。步進電機驅動信號為脈沖信號,當步進驅動器接收到一個脈沖信號,它就驅動步進電機按設定的方向轉動一個固定的角度(即步進角)。
我們可以通過控制脈沖個數來控制角位移量,從而達到准確定位的目的;同時我們可以通過控制脈沖頻率來控制電機轉動的速度和加速度,從而達到調速的目的
2.硬件連接
CH32V103開發板與ULN2003步進電機驅動板的連接方式如下:
PB6連接驅動板的IN1引腳
PB7連接驅動板的IN2引腳
PB8連接驅動板的IN3引腳
PB9連接驅動板的IN4引腳
3.MRS中開發流程
1)首先新建一個CH32V103C8T6 的工程,這個要與對應芯片對應
上圖最下方紅框中是對選中芯片的資源的簡單介紹,方便查詢
2) 新建完工程之后,我們打開main.c文件,可以看到主函數只是一些初始化和串口打印,我們自己的主函數邏輯可以添加在打印下面就可以了;
3) 新建一個hardware的文件夾,右鍵工程new->folder,填寫文件名,點擊finish即可,我們可以以同樣的方式在hardware目錄下再新建SD目錄,SPI目錄,條理清晰。
4) 在SPI目錄下,New>Source File,填寫文件名gpio.c,內容是電機初始化函數以及調速轉向停止函數,在新建個gpio.h文件用來聲明函數,這個新的頭文件需要添加到頭文件尋址路徑中,點擊菜單欄工程屬性配置按鈕,在彈出的頁面中,如下圖,點擊綠色加號添加路徑即可
驅動代碼如下:
1 #include "gpio.h" 2 3 #include "debug.h" 4 5 6 7 //#define N 4 8 9 #define N 8 10 11 12 13 //步進電機正反轉數組 數組的值,即對應GPIO引腳的值 14 15 //單四拍 16 17 //uint16_t phasecw[4] ={0x0200,0x0100,0x0080,0x0040};// D-C-B-A.(9-8-7-6) 18 19 //uint16_t phaseccw[4]={0x0040,0x0080,0x0100,0x0200};// A-B-C-D.(6-7-8-9) 20 21 22 23 ////雙四拍 24 25 //uint16_t phasecw[4] ={0x0300,0x0180,0x00C0,0x0240};// DC-CB-BA-AD. 26 27 //uint16_t phaseccw[4]={0x00C0,0x0180,0x0300,0x0240};// AB-BC-CD-DA. 28 29 30 31 //四相八拍 32 33 uint16_t phasecw[8] ={0x0200,0x0300,0x0100,0x0180,0x0080,0x00C0,0x0040,0x0240};// D-DC-C-CB-B-BA-A-AB. 34 35 uint16_t phaseccw[8]={0x0040,0x00C0,0X0080,0x0180,0x0100,0x0300,0x0200,0x0240};// A-AB-B-BC-C-CD-D-DA. 36 37 38 39 //電機初始化函數 40 41 void Moto_Init(void) 42 43 { 44 45 //步進電機初始化 46 47 // IN1: PB6 a 48 49 // IN2: PB7 b 50 51 // IN3: PB8 c 52 53 // IN4: PB9 d 54 55 GPIO_InitTypeDef GPIO_InitStructure; 56 57 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); 58 59 60 61 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 ; 62 63 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 64 65 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 66 67 GPIO_Init(GPIOB,&GPIO_InitStructure); 68 69 70 71 GPIO_ResetBits(GPIOB,GPIO_Pin_6 | GPIO_Pin_7 |GPIO_Pin_8 |GPIO_Pin_9 ); 72 73 } 74 75 76 77 //電機正轉函數 78 79 //其中,speed的值越大,速度越慢,值越小,速度越快,speed相當於調節脈沖速度 80 81 //轉動速度和脈沖頻率成正比,在此處,延時越小,頻率越高 82 83 void Motorcw(u8 speed) 84 85 { 86 87 uint8_t i=0; 88 89 90 91 for(i=0;i<N;i++) 92 93 { 94 95 GPIO_Write(GPIOB,phasecw[i]); 96 97 Delay_Ms(speed); 98 99 } 100 101 } 102 103 104 105 //電機反轉函數 106 107 void Motorccw(u8 speed) 108 109 { 110 111 uint8_t i; 112 113 for(i=0;i<N;i++) 114 115 { 116 117 GPIO_Write(GPIOB,phaseccw[i]); 118 119 Delay_Ms(speed); 120 121 } 122 123 } 124 125 126 127 //電機停止函數 128 129 void MotorStop(void) 130 131 { 132 133 //GPIO_ResetBits(GPIOB,GPIO_Pin_6 | GPIO_Pin_7 |GPIO_Pin_8 |GPIO_Pin_9 ); 134 135 GPIO_Write(GPIOB,0x0000); 136 137 } 138 139 140 141 //電機正轉角度 142 143 void Motorcw_angle(int angle,int speed) 144 145 { 146 147 int i,j; 148 149 j=(int)(angle/0.70312); 150 151 for(i=0;i<j;i++) 152 153 { 154 155 Motorcw(speed); 156 157 } 158 159 } 160 161 162 163 //電機反轉角度 164 165 void Motorccw_angle(int angle,int speed) 166 167 { 168 169 int i,j; 170 171 j=(int)(angle/0.70312); 172 173 for(i=0;i<j;i++) 174 175 { 176 177 Motorccw(speed); 178 179 } 180 181 }
主函數可以調用我們驅動中的正反轉函數來說實現想要的功能
int main(void) { USART_Printf_Init(115200); Moto_Init(); Delay_Init(); printf("This is Stepper motor driver\r\n"); Motorcw_angle(360,5); //步進電機正轉角度函數 MotorStop(); Delay_Ms(1000); Motorccw_angle(360,5); //步進電機反轉角度函數 MotorStop(); Delay_Ms(1000); }
代碼編輯完成,點擊菜單欄編譯按鈕,在console窗口查看編譯結果,無錯誤,就可以進入到調試去驗證邏輯,點擊菜單欄調試按鈕,如果運行現象和理論不一致,可以通過左下角反匯編窗口,斷點,外設寄存器,內核寄存器這幾個窗口來配合查找邏輯BUG
小提示,當程序運行到 HardFault_Handler 函數,可以觀察Rregister窗口的mepc,mtval,mcause三個寄存器,分別代表,進入硬件錯誤中斷前的pc,cpu取到的值,以及進入異常的原因。
4.驗證
將編譯好的程序下載到開發版並復位,通過邏輯分析儀對這幾個GPIO引腳進行波形采集,具體如下圖。將開發板、步進電機驅動板、步進電機連接起來,可看到電機進行正反轉。