cpubbs论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

LabVIEW+单片机学习套件全套教程资料下载[免费]LabVIEW论坛精华列表贴USB0816数据采集卡《LabVIEW宝典》
LabWindows/CVI论坛精华贴NET0816以太网数据采集卡RC0210远程设备授权系统 关闭关停锁定打开设备 户外分布式数据采集
NET1624低速高精度以太网数据采集卡WIFI0824SD无线WIFI网络数据采集卡脱机运行 SD存储 小尺寸微型 串口采集远程采集 安卓 手持移动采集 纪录仪
查看: 722|回复: 0

单片机控制直流电机转速的问题

[复制链接]
发表于 2010-7-8 15:24:33 | 显示全部楼层 |阅读模式
单片机控制直流电机转速的问题
这是PWM调速的程序,我进行调试过程序没问题。
/******************************************************************************
*                                                                            *
*关于频率和占空比的确定,对于12M晶振,假定PWM输出频率为1KHZ,这样定时中断次数 *
*设定为C=10,即0.01MS中断一次,则TH0=FF,TL0=F6;由于设定中断时间为0.01ms,这样*
*可以设定占空比可从1-100变化。即0.01ms*100=1ms                               *
******************************************************************************/
#include <REGX51.H>
#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=30;            /*占空比初始值设定*/
  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; /*时间小于等于100ms*/
if(click<=ZKB1)        /*当小于占空比值时
输出低电平,高于时是高电平,从而实现占空比的调整*/
  P1_0=0;
else
  P1_0=1;  
if(click<=ZKB2)                        
  P1_1=0;
else
  P1_1=1;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|cpubbs论坛. ( 粤ICP备09171248号 )

GMT+8, 2025-4-4 20:04 , Processed in 0.506098 second(s), 7 queries , Gzip On, File On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表