完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
RISC-V MCU开发实战(四) :步进电机
软件平台: MounRiver Studio(MRS),硬件平台: CH32V103开发板、ULN2003步进电机驱动板、28BYJ-48步进电机,使用GPIO进行步进电机控制。
输入5VTTL电平,输出可达500mA/50V。 ULN2003是高耐压、大电流达林顿系列,由七个硅NPN达林顿管组成。 该电路的特点如下: ULN2003的每一对达林顿都串联一个2.7K的基极电阻,在5V的工作电压下它能与TTL和CMOS电路 直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。 关于步进电机,此处所用电机型号为28BYJ-48(步进电机),减速比为1:64,步进脚为5.625/64度,如果需要转动转动一圈,那么需要 360/5.625*64=4096 个脉冲信号。 步进电机是一种将电脉冲转化为角位移的执行设备。步进电机驱动信号为脉冲信号,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(即步进角)。 我们可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时我们可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的
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 93 { 94 95 GPIO_Write(GPIOB,phasecw); 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 115 { 116 117 GPIO_Write(GPIOB,phaseccw); 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 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 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 driverrn"); 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取到的值,以及进入异常的原因。
|
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2956 浏览 16 评论
3458 浏览 1 评论
8996 浏览 16 评论
4051 浏览 18 评论
1108浏览 3评论
572浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1858浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 18:05 , Processed in 1.190458 second(s), Total 80, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号