1 实验现象
2 实验原理
通过按键来控制PWM占空比实现对直流电机的调速,数码管则显示当前速度挡位信息。
(1)直流电机的控制是通过设置PWM波的占空比来控制直流电机的转速,占空比越大,转速越快,越小转速越低;
(2)单片机的I/O口是不能直接驱动电机的,所以还需要用一个驱动芯片。如 LG9110、CMO825、L298 等。驱动芯片可以将单片机I/O输出信号放大,这样电机中流过的电流足够大,电机才能转起来。
(3)直流电机只有两根电源线,直流电机的两根电源线是不分正负极的。假设两根电源线代号分别为A、B。 当A线接正极,B线接负极时,电机正转(反转);那么当B线接正极,A线接负极时,电机反转(正转)。
3 参考程序
3.1 主程序
#include #include 'delayms.h' #include 'key.h' #include 'Nixie.h' #include 'timer0.h' sbit Motor=P1^3; //直流电机,高电平驱动 unsigned char Counter,Compare; //计数值和比较值,用于输出PWM unsigned char KeyNum,Speed; void main() { timer0_init(); while(1) { KeyNum=key(); if(KeyNum==1) { Speed++; Speed%=4; //计数值计算范围为0-3 if(Speed==0) {Compare=0;} if(Speed==1) {Compare=50;} if(Speed==2) {Compare=75;} if(Speed==3) {Compare=100;} } Nixie(1,Speed); } } void Timer0_Routine() interrupt 1 { TL0 = 0xAE; //设置定时初始值,100us,@11.0592MHz TH0 = 0xFB; //设置定时初始值,100us,@11.0592MHz Counter++; Counter%=100; //计数值计算范围为0-99 if(Counter Motor=1; //高电平驱动,电机转动 } else { Motor=0; //电机停止 } } 3.2 延时函数 #include void delayms(unsigned int xms) //@11.0592MHz { unsigned char i, j; while(xms--) { _nop_(); i = 2; j = 199; do { while (--j); } while (--i); } } #ifndef _delayms_h_ #define _delayms_h_ delayms(unsigned int xms); #endif 3.3 按键扫描函数 #include #include 'delayms.h' sbit key1 = P3^1; sbit key2 = P3^0; sbit key3 = P3^2; sbit key4 = P3^3; /** * @brief 获取独立按键键码 * @param 无 * @retval 按下按键的键码,范围:0~4,无按键按下时返回值为0 */ unsigned char key() { unsigned char KeyNumber = 0; if(key1==0){delayms(20);while(key1==0);delayms(20);KeyNumber=1;} if(key2==0){delayms(20);while(key2==0);delayms(20);KeyNumber=2;} if(key3==0){delayms(20);while(key3==0);delayms(20);KeyNumber=3;} if(key4==0){delayms(20);while(key4==0);delayms(20);KeyNumber=4;} return KeyNumber; } #ifndef _key_h_ #define _key_h_ unsigned char key(); #endif 3.4 数码管扫描函数 #include #include 'delayms.h' sbit HC138_A=P2^2; sbit HC138_B=P2^3; sbit HC138_C=P2^4; //数码管段码表,0-9 unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; /** * @brief 数码管显示 * @param Location 要显示的位置,范围:1~8 * @param Number 要显示的数字,范围:段码表索引范围 * @retval 无 */ void Nixie(unsigned char Location,Number) { switch(Location) //位码输出 { case 1:HC138_C=1;HC138_B=1;HC138_A=1;break; case 2:HC138_C=1;HC138_B=1;HC138_A=0;break; case 3:HC138_C=1;HC138_B=0;HC138_A=1;break; case 4:HC138_C=1;HC138_B=0;HC138_A=0;break; case 5:HC138_C=0;HC138_B=1;HC138_A=1;break; case 6:HC138_C=0;HC138_B=1;HC138_A=0;break; case 7:HC138_C=0;HC138_B=0;HC138_A=1;break; case 8:HC138_C=0;HC138_B=0;HC138_A=0;break; } P0=NixieTable[Number]; //段码输出 delayms(1); //显示一段时间 P0=0x00; //段码清0,消影 } #ifndef __NIXIE_H__ #define __NIXIE_H__ void Nixie(unsigned char Location,Number); #endif 3.5 定时器函数 #include /** * @brief 定时器0初始化,100微秒@11.0592MHz * @param 无 * @retval 无 */ void timer0_init(void) //100微秒@11.0592MHz { TMOD &= 0xF0; //设置定时器模式,1111_0000,&,高四位保留,低四位清零 TMOD |= 0x01; //设置定时器模式,0000_0001,|,高四位保留,设置模式为T0 TL0 = 0xAE; //设置定时初始值,100us,@11.0592MHz TH0 = 0xFB; //设置定时初始值,100us,@11.0592MHz TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时 ET0=1; //打开定时器T0中断开关 EA=1; //打开中断系统总开关 PT0=0; //设置T0中断优先级,低 } /*定时器中断函数模板 void Timer0_Routine() interrupt 1 { static unsigned int T0Count; TL0 = 0x66; //设置定时初值,1毫秒@11.0592MHz TH0 = 0xFC; //设置定时初值,1毫秒@11.0592MHz T0Count++; if(T0Count>=1000) { T0Count=0; } } */ #ifndef _timer0_h_ #define _timer0_h_ void timer0_init(void); #endif
上一篇:步进电机控制+普中51单片机+普中官方
下一篇:呼吸灯(PWM)+普中51单片机+江科大自化协
- 热门资源推荐
- 热门放大器推荐
设计资源 培训 开发板 精华推荐
- 用于照明的 20 个 LED 背光 LED 驱动器
- PD供电便携T12
- AM3GW-4805SZ 5V 3W DC/DC 转换器的典型应用
- SiP2800低功耗电流模式控制器典型应用电路
- 【立创开发板】梁山派平衡小车(欢迎观看我稳如老狗小车)
- 基于涂鸦智能的湿温度传感器
- LT3663EDCB-3.3、5V 降压转换器的典型应用
- W681310 ES,基于 W681310 的单通道编解码器迷你评估板
- SECO-LVDCDC3064-SIC-GEVB:6-18 Vdc 输入隔离式 SiC 栅极驱动器电源 +20V/-5V/5V,带汽车级 NCV3064 控制器评估板
- 具有低噪声 12V 线性稳压器的 LTC1539IGW 高效率 5V/20mA 待机、3.3V/2.5A 稳压器的典型应用电路
- 【已结束】 Qorvo、村田、NI直播【UWB最新技术、方案、市场、应用解析】(13:30开始入场)
- 有奖活动 | 来 Pl BridgeSwitch™ 技术中心探秘半桥电机驱动器新技术
- Vicor 更好的供电方式,更高的性能、功能性及可靠性
- 动手学电源第一季:DIY 小风扇,Fan一夏!
- 邀你参加2018年论坛体验问卷调查
- 有奖直播 | 瑞萨新一代视觉 AI MPU 处理器 RZ/V2H:高算力、低功耗、实时控制
- 报名赢红包,到场抽开发板|2021 RT-Thread 开发者大会等你约!
- Digi-Key KOL视频来袭~资深算法工程师畅聊图像处理秘诀
- 【EEWORLD第四十二届】2012年09月社区明星人物揭晓!