- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
设计要求:
采用定时中断方式控制步进机的转速,定时单位时长为10ms。
速度设置在1/2/3/4四个档位,1档最快,依次递减,能够控制步进电机的停、转和方向,同时显示步进机的当前档位。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
设计思路:
通过P1控制步进电机的转动,P1.0->a,P1.1->b,P1.2->c,P1.3->d,ULN2003A作为步进电机驱动
P2.0-P2.3对应数码管显示(使用7447芯片对应将BCD码转换成7端LED数码管),通过7447简单驱动数码管(P2只需要发送1/2/3/4即可)
通过定时器计数,到达设定值时步进电机转动1/4圈,计数清零
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
元件清单:
BUTTON
MOTOR-STEPPER
RESPACK-8
7SEG-COM-ANODE
ULN2003A
7447
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
实现代码:
#include typedef unsigned char uchar; uchar direction = 0; //0为正转,1为反转 uchar onoff = 0; //关为0,开为1 uchar n = 0; //每次定时器中断触发时n++,当n==max时电机转动1/4 uchar max = 10; uchar index = 0; //通过index指示电机转动,AB,BC,CD,DA sbit LED = P3 ^ 7; //当n==max时LED闪烁提示 int main() { /* LED */ P2 = 0xff; /* 初始化中断 */ EA = 1; EX0 = 1; //要用到的中断是两个外部中断和定时器中断0 IT0 = 1; EX1 = 1; IT1 = 1; ET0 = 1; /* 定时器0 */ TMOD = 0x01; //使用定时器0,方式1 TH0 = (65536 - 10000) / 256; //12MHz晶振下,定时器为10ms触发中断,更方便观察转动情况 TL0 = (65536 - 10000) % 256; TR0 = 1; while(1) { switch(P0) { case 0xfe: //11111110 max = 1; P2 = 1; break; case 0xfd: //11111101 max = 10; P2 = 2; break; case 0xfb: //11111011 max = 50; P2 = 3; break; case 0xf7: //11110111 max = 100; P2 = 4; break; } } } void Stop()interrupt 0 { onoff++; if (onoff > 1) onoff = 0; } void int1()interrupt 2 { direction++; if (direction > 1) direction = 0; } void delay50ms(void) { unsigned char a, b; for(b = 173; b > 0; b--) for(a = 143; a > 0; a--); } void time()interrupt 1 { TH0 = (65536 - 10000) / 256; TL0 = (65536 - 10000) % 256; if (onoff == 1) //在开状态下 { if (n == max) //设定档位速度,经过了max次中断后,步进电机转1/4圈 { LED = 0; //每次n==max时LED闪烁 delay50ms(); LED = 1; if (direction == 0) { switch(index) //正转时以AB,BC,CD,DA顺序 { case 0:P1 = 0x03;break; //00000011 AB高电平 case 1:P1 = 0x06;break; //00000110 BC高电平 case 2:P1 = 0x0c;break; //00001100 CD高电平 case 3:P1 = 0x09;break; //00001001 DA高电平 } index ++; if (index == 4) //步进电机转完一圈时index清零 index = 0; n = 0; //到达max,n重置为0 } if (direction == 1) { switch(index) //反转时以DA,CD,BC,AB顺序 { case 0:P1 = 0x09;break; case 1:P1 = 0x0c;break; case 2:P1 = 0x06;break; case 3:P1 = 0x03;break; } index ++; if (index == 4) index = 0; n = 0; } else n = 0; } n++; //n!=max时,n++ } else n = 0; //在关状态下,n始终为0,无法触发电机转动 }
上一篇:基于单片机的电机转速测量系统设计
下一篇:基于单片机的简易计算器设计
推荐阅读最新更新时间:2024-11-03 10:10
设计资源 培训 开发板 精华推荐
- pcb校园
- 适用于LoRa™的USI®STM32™Nucleo扩展板
- IS31FL3193-DLS2-EB,使用 IS31FL3193 PWM 控制的评估板,3 通道趣味 LED 驱动器
- OP484ESZ 单电源、3V 低噪声仪表放大器的典型应用
- LTC1562、256kHz 线性相位 6 阶低通滤波器
- 姿态传感器-MPU6050-卡尔曼/DMP姿态解算
- LT3663EMS8E、具有隔离式 3.3V 输出的 5V 降压型稳压器的典型应用
- EVAL-RS485FD8EBZ,采用 8 引脚 SOIC 封装的 ADM3488 半双工 RS-485 收发器评估板
- 用于 48V、500W 电动自行车/踏板车的 LTC2992HDE 功率监视器的典型应用
- 电压跟随器(op07 opa690)
- Waymo打造最大弱势道路使用者交通事故数据集 可帮助指导自动驾驶系统研发
- 车载显示,大步向前
- 新专利:未来福特汽车或将配备亮度管理系统
- 科学家研发基于AI的身份验证工具 可保护车辆免受网络攻击威胁
- Microchip推出广泛的IGBT 7 功率器件组合,专为可持续发展、电动出行和数据中心应用而设计
- 面向未来驾驶体验 博世推出新型微电子技术
- 英飞凌与马瑞利合作 利用AURIX™ TC4x MCU系列推动区域控制单元创新
- 5C超充,该怎么卷?
- 《2025年度中国汽车十大技术趋势》正式揭晓!你最看好哪个?
- Microchip推出新型VelocityDRIVE™软件平台和车规级多千兆位以太网交换芯片,支持软件定义汽车
- 阅读罗彻斯特电子停产半导体器件解决方案,答题赢取京东卡啦!
- 打造健康生活,成就强劲工具 TE Connectivity (TE) 智慧生活子系统解决方案
- 预约有奖直播:享受纯净 ams主动降噪与接近传感带来耳机设计新境界
- 4月25日上午10:00-11:30 ADI与您相约 TOF (Time Of Flight) 技术介绍及产品应用 有奖直播
- ADI & 世健 新基建系列第三期——5G 仪器仪表和测试 答题赢好礼!
- 南芯SC8905 评估板免费测评,支持充放电双向操作
- 下载有好礼!罗姆带您学习电源设计应用小技巧(功率器件篇)
- 2021 Digikey KOL系列——亲手教你转起一台无刷电机
- 盛夏嗨学有礼——和dcexpert一起学ESP8266
- 趣味电子技术史话第二讲:开关电源的早期历史