基于单片机用软件实现直流电机PWM调速系统的开题报告

作者&投稿:柯依 (若有异议请与网页底部的电邮联系)
基于单片机实现直流电机PWM调速系统~

这个已经调试成功 ,你自己改下端口就可以了 O(∩_∩)O哈哈~
/******************************************************************************
* *
*关于频率和占空比的确定,对于12M晶振,假定PWM输出频率为1KHZ,这样定时中断次数 *
*设定为C=10,即0.01MS中断一次,则TH0=FF,TL0=F6;由于设定中断时间为0.01ms,这样*
*可以设定占空比可从1-100变化。即0.01ms*100=1ms *
******************************************************************************/
#include
#define uchar unsigned char
/*****************************************************************************
* TH0和TL0是计数器0的高8位和低8位计数器,计算办法:TL0=(65536-C)%256; *
* TH0=(65536-C)/256,其中C为所要计数的次数即多长时间产生一次中断;TMOD是计数器*
* 工作模式选择,0X01表示选用模式1,它有16位计数器,最大计数脉冲为65536,最长时 *
* 间为1ms*65536=65.536ms *
******************************************************************************/
#define V_TH0 0XFF
#define V_TL0 0XF6
#define V_TMOD 0X01

void init_sys(void); /*系统初始化函数*/
void Delay5Ms(void);

unsigned char ZKB1,ZKB2;

void main (void)
{
init_sys();
ZKB1=40; /*占空比初始值设定*/
ZKB2=70; /*占空比初始值设定*/
while(1)
{
if (!P1_4) //如果按了+键,增加占空比
{
Delay5Ms();
if (!P1_4)
{
ZKB1++;
ZKB2=100-ZKB1;
}
}

if (!P1_5) //如果按了-键,减少占空比
{
Delay5Ms();
if (!P1_5)
{
ZKB1--;
ZKB2=100-ZKB1;
}
}
/*对占空比值限定范围*/
if (ZKB1>99) ZKB1=1;
if (ZKB1<1) ZKB1=99;

}



}


/******************************************************
*函数功能:对系统进行初始化,包括定时器初始化和变量初始化*/
void init_sys(void) /*系统初始化函数*/
{
/*定时器初始化*/
TMOD=V_TMOD;
TH0=V_TH0;
TL0=V_TL0;
TR0=1;
ET0=1;
EA=1;
}


//延时
void Delay5Ms(void)
{
unsigned int TempCyc = 1000;
while(TempCyc--);
}

/*中断函数*/
void timer0(void) interrupt 1 using 2
{
static uchar click=0; /*中断次数计数器变量*/
TH0=V_TH0; /*恢复定时器初始值*/
TL0=V_TL0;
++click;
if (click>=100) click=0;

if (click<=ZKB1) /*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/
P1_0=0;
else
P1_0=1;

if (click<=ZKB2)
P1_1=0;
else
P1_1=1;

}

用89C51编的程,步进电机调速,看你能不能用到
ORG 0000H
LJMP MAIN
ORG 001BH
LJMP LOOP
ORG 0100H
MAIN: MOV R0,#08H
MOV P0,#0FFH
MOV TMOD,#10H
JB P1.6,SK7
MOV DPTR,#FORWARD
SJMP SUDU
SK7: JNB P1.7,SK6
SJMP MAIN
SK6: MOV DPTR,#REVERSE
SUDU:JNB P1.0,L0
JNB P1.1,L1
JNB P1.2,L2
JNB P1.3,L3
JNB P1.4,L4
JNB P1.5,L5
SJMP MAIN
L0: MOV TL1,#00H
MOV TH1,#00H
SJMP LOOP1
L1: MOV TL1,#22H
MOV TH1,#22H
SJMP LOOP1
L2: MOV TL1,#44H
MOV TH1,#44H
SJMP LOOP1
L3: MOV TL1,#66H
MOV TH1,#66H
SJMP LOOP1
L4: MOV TL1,#88H
MOV TH1,#88H
SJMP LOOP1
L5: MOV TL1,#0AAH
MOV TH1,#0AAH
LOOP1: MOV IE,#88H
SETB TR1
SJMP $
FORWARD: DB 0EH,0CH,0DH,09H,0BH,03H,07H,06H
REVERSE: DB 06H,07H,03H,0BH,09H,0DH,0CH,0EH
LOOP:JNB P1.0,L01
JNB P1.1,L11
JNB P1.2,L21
JNB P1.3,L31
JNB P1.4,L41
JNB P1.5,L51
SJMP LOOP
L01: MOV TL1,#00H
MOV TH1,#00H
SJMP LOOP2
L11: MOV TL1,#22H
MOV TH1,#22H
SJMP LOOP2
L21: MOV TL1,#44H
MOV TH1,#44H
SJMP LOOP2
L31: MOV TL1,#66H
MOV TH1,#66H
SJMP LOOP2
L41: MOV TL1,#88H
MOV TH1,#88H
SJMP LOOP2
L51: MOV TL1,#09FH
MOV TH1,#09FH
LOOP2:MOV A,#00H
MOVC A,@A+DPTR
MOV P0,A
INC DPTR
DJNZ R0,LOOP3
MOV R0,#08H
JB P1.6,SK72
MOV DPTR,#FORWARD
SJMP LOOP3
SK72: JNB P1.7,SK62
SJMP LOOP
SK62: MOV DPTR,#REVERSE
LOOP3: RETI
END

  这里有个PWM控制LED给你参考下

  使用两个定时器Timer0和Timer1中断实现PWM控制LED明暗效果。其中Timer0工作在方式1用于脉冲宽定时,Timer1工作于方式2用于占空比的定时。在这个程序里,脉冲宽是个固定的值,通过递增、递减改变占空比,从而实现LED明暗效果。如果将LED换作蜂鸣器,通过改变脉冲宽可改变音调。

  /**************************************/
  //文件名:main.c
  //作 者:jammy-lee
  //日 期:2009-3-18
  //功 能:使用两个定时器模拟PWM
  /**************************************/

  //头文件
  #include<reg51.h>

  //宏定义
  typedef unsigned char uint8;
  typedef unsigned int uint16;
  typedef long unsigned int uint32;

  uint16 time0;
  uint16 PULSE_WIDTH = 0x300; //脉冲宽
  uint8 DUTY_CYCLE = PULSE_WIDTH*(1/5);//占空比

  //延时子程序
  void delay(uint8 ms)
  {
  uint8 i;
  while(ms--)
  {
  for(i=0;i<120;i++);
  }
  }

  //定时器0,控制低电平
  void Timer0() interrupt 1
  {
  TR1 = 0; //关闭定时器1
  time0 = 0xFFFF - PULSE_WIDTH; //定时器0初始值
  TL0 = (uint8)time0;
  TH0 = time0 >> 8;
  TH1 = DUTY_CYCLE;
  TR1 = 1;
  P0 = 0x00; //打开定时器1
  }

  //定时器1.控制高电平
  void Timer1() interrupt 3
  {
  TR1 = 0; //关闭定时器1
  P0 = 0xFF;
  }

  //主函数
  int main(void)
  {
  TMOD = 0x21; //定时器1:工作方式1,定时器0:工作方式2
  time0 = 0xFFFF - PULSE_WIDTH; //定时器0初始值
  TL0 = (uint8)time0;
  TH0 = time0 >> 8;
  TL1 = DUTY_CYCLE;
  TH1 = DUTY_CYCLE;
  EA = 1; //允许全局中断
  ET0 = 1; //允许定时器0中断
  ET1 = 1; //允许定时器1中断
  TR0 = 1;

  //主循环
  while(1)
  {

  do{
  if(DUTY_CYCLE != PULSE_WIDTH*(1/4))
  {
  DUTY_CYCLE++;
  delay(5);
  }
  else break;
  }while(1);

  do{
  if(DUTY_CYCLE != 0x01)
  {
  DUTY_CYCLE--;
  delay(5);
  }
  else break;
  }while(1);

  }
  }

二楼的兄弟可否报一下书名,我想看一下这本书。

  这里有个PWM控制LED给你参考下
  使用两个定时器Timer0和Timer1中断实现PWM控制LED明暗效果。其中Timer0工作在方式1用于脉冲宽定时,Timer1工作于方式2用于占空比的定时。在这个程序里,脉冲宽是个固定的值,通过递增、递减改变占空比,从而实现LED明暗效果。如果将LED换作蜂鸣器,通过改变脉冲宽可改变音调。
  /**************************************/
  //文件名:main.c
  //作
者:jammy-lee
  //日
期:2009-3-18
  //功
能:使用两个定时器模拟PWM
  /**************************************/
  //头文件
  #include<reg51.h>
  //宏定义
  typedef
unsigned
char
uint8;
  typedef
unsigned
int
uint16;
  typedef
long
unsigned
int
uint32;
  uint16
time0;
  uint16
PULSE_WIDTH
=
0x300;
//脉冲宽
  uint8
DUTY_CYCLE
=
PULSE_WIDTH*(1/5);//占空比
  //延时子程序
  void
delay(uint8
ms)
  {
  uint8
i;
  while(ms--)
  {
  for(i=0;i<120;i++);
  }
  }
  //定时器0,控制低电平
  void
Timer0()
interrupt
1
  {
  TR1
=
0;
//关闭定时器1
  time0
=
0xFFFF
-
PULSE_WIDTH;
//定时器0初始值
  TL0
=
(uint8)time0;
  TH0
=
time0
>>
8;
  TH1
=
DUTY_CYCLE;
  TR1
=
1;
  P0
=
0x00;
//打开定时器1
  }
  //定时器1.控制高电平
  void
Timer1()
interrupt
3
  {
  TR1
=
0;
//关闭定时器1
  P0
=
0xFF;
  }
  //主函数
  int
main(void)
  {
  TMOD
=
0x21;
//定时器1:工作方式1,定时器0:工作方式2
  time0
=
0xFFFF
-
PULSE_WIDTH;
//定时器0初始值
  TL0
=
(uint8)time0;
  TH0
=
time0
>>
8;
  TL1
=
DUTY_CYCLE;
  TH1
=
DUTY_CYCLE;
  EA
=
1;
//允许全局中断
  ET0
=
1;
//允许定时器0中断
  ET1
=
1;
//允许定时器1中断
  TR0
=
1;
  //主循环
  while(1)
  {
  do{
  if(DUTY_CYCLE
!=
PULSE_WIDTH*(1/4))
  {
  DUTY_CYCLE++;
  delay(5);
  }
  else
break;
  }while(1);
  do{
  if(DUTY_CYCLE
!=
0x01)
  {
  DUTY_CYCLE--;
  delay(5);
  }
  else
break;
  }while(1);
  }
  }

基于单片机用软件实现直流电机PWM调速系统的开题报告
答:使用两个定时器Timer0和Timer1中断实现PWM控制LED明暗效果。其中Timer0工作在方式1用于脉冲宽定时,Timer1工作于方式2用于占空比的定时。在这个程序里,脉冲宽是个固定的值,通过递增、递减改变占空比,从而实现LED明暗效果。如果将LED换作蜂鸣器,通过改变脉冲宽可改变音调。/***/ //文件名:main.c //...

51单片机控制直流电机。(c语言控制)
答:有3种方案:第一种,通过PWM脉宽调制输出方法控制转速,控制占空比的大小可以实现调速!第二种,通过AD转换的方法控制直流电机的电压 第三种,用xtr115程控电流源来控制直流电机(类似第二种方法)如果以上的驱动能力不够的话再加上一个电压跟随器!程序方面就是一个寄存器的配置问题了,你查一下单片机的...

基于单片机的直流电机PWM调速控制(要单片机的代码)快啊
答:; 利用定时器控制产生占空比可变的 PWM 波 ; 按K1,PWM值增加,则占空比减小,LED 灯渐暗。; 按K2,PWM值减小,则占空比增加,LED 灯渐亮。;当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警 ;资源:p0口,8路指示灯。p1.4,p1.5亮度控制按键(端口按键)p3.7小喇叭报警 ;--- PWM ...

单片机直流电机调速系统的设计
答:AT89C52产生单极性工作制的定频PWM脉冲,配合驱动能力强大的L298,从而实现控制和调整直流电机转速和转向的功能。利用软件编程,能够设置多个占空比不同的脉冲,使得电机转速可以逐步增大或减小,同时在LCD上显示电机的工作状态,易于观察和识别。本设计主要由电机调速控制模块和LCD显示模块组成,具有电路简单,可靠...

51单片机怎么驱动直流电机c语言
答:51单片机驱动直流电机程序(用的是l298n芯片):include<reg51.h> include<math.h> defineuintunsignedint defineucharunsignedchar defineN100 sbit s1=P1^0;//电机驱动口 sbits2=P1^1;//电机驱动口 sbits3=P1^2;//电机驱动口 sbits4=P1^3;//电机驱动口 sbiten1=P1^4;//电机使能端 sbiten2...

单片机直流电机控制程序
答:以AVR Attiny2313为例,用的是BASCOM-AVR.,basic语言。将电机两极置于b0,b1口 Config portb=output Do wait 1 `等待一秒 portb.1=1 `=1表示b1口接 5v portb.0=0 `=0表示b0口接负极 loop 可以根据自己需要改写代码 参考资料:松江二中

求高手帮助编写51单片机控制直流电动机正反转的程序
答:这个很简单啊!只须要一个引脚就可以搞定:用两只继电器,把他们的线圈引脚并连。并联接单片机的其中一个引脚相连即可。(一只继电器有两对触头,即常开和常闭,把一只继电器的常开脚与另一只继电器的常闭相连,注:每只继电器的两对触头都要用上,然后公共脚接电源的正负两极,再把电机的两个脚上引出的...

单片机控制直流电动机
答:如果是开环控制,最简单,可以用PWM(即脉宽调制)来改变送给电动机的平均电压,达到调节的目的。如附图示意。如果是闭环控制,则需要加传感器。例如要闭环控制转速,则需要加装一个转速传感器,将传感器信号送给单片机。单片机通过一定的软件算法测出转速,将实测转速和要求的转速比较,采用某种控制算法(例如...

51单片机怎么让直流电机转动
答:一般而言,所有单片机的端口驱动能力都有限,还有电机的额定电压也许会比单片机的供电电压高,直接驱动电机有困难。这时候要想驱动电机,就必须根据电机的额定电压和额定功率采用合适的功率器件去驱动。下边的电路图是我工程上实际使用的,可以正反转,脉宽调制的话还可以调速。

单片机控制PWM直流电机的c程序!!!急求!!!
答:// 按K2,PWM值减小,则占空比增加,电机加速。// 当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警。/***/ include<reg51.h> include<intrins.h> sbit K1 =P1^4 ; //PWM值增加键 sbit K2 =P1^5 ; //PWM值减少键 sbit BEEP =P3^7 ; //蜂鸣器 unsigned char PWM=...