文章首页 | 基础入门 | 电路原理图 | 濮婎垰鑸伴崶鎯х杽娓氾拷 | PLC閸╄櫣顢�   閵嗗﹤顩ч弸婊冩灘濞嗐垺婀扮粩娆欑礉鐠囬攱瀵� Ctrl+D 閹靛濮╅弨鎯版閿涗焦鍔呯拫銏″亶閻ㄥ嫭鏁幐浣碘偓锟�娑撯偓鐠у嘲顒熸稊鐘辩鐠х柉绻樺銉礉閻㈤潧鐡欏鈧崣鎴犲竾濞嗐垼绻嬮幃顭掔磼.

电子开发网

电子开发网电子设计 | 电子开发网Rss 2.0 会员中心 会员注册

閳藉懐鏁哥捄顖氬彆瀵繑澧滈崘宀嬬礉閺堚偓閺傛壆澧楅妴濠勬暩鐎涙劗鏁哥捄顖氬彆瀵繗顓哥粻妤€娅掗妴瀣剁礉閻絻鐭鹃崗顒€绱¢弻銉嚄閹靛鍞� 閻絻鐭鹃崗顒€绱$拋锛勭暬閸c劊鈧劗鏁哥€涙劒绮犳稉姘眽閸涙ê绻€婢跺洦澧滈崘灞烩偓锟�
閳藉棗宕勬径鈺侇劅娴兼艾宕熼悧鍥ㄦ簚鐎圭偘绶�100 c鐠囶叀鈻� chm閺嶇厧绱¢妴鍌濈カ閺傛瑥鍞寸€圭顕涚紒鍡礉鐟曞棛娲婃笟瀣摍婢舵熬绱濋崘鍛啇楠炶¥鈧劗鏁哥€涙劒绮犳稉姘眽閸涙ê绻€婢跺洦澧滈崘灞烩偓锟�
搜索: 您现在的位置: 电子开发网 >> 电子开发 >> EDA开发应用 >> Keilc >> 正文

直流电机控制Keil c51源代码

作者:佚名    文章来源:本站原创    点击数:2068    更新时间:2011-3-3

直流电机的开环控制Keil c51源代码

//-----------------------函数声明,变量定义--------------------------------------------------------
#include <reg51.h>
#include <intrins.h>
#include<ABSACC.H>  
//-----------------------定义管脚--------------------------------------------------------
sbit PWM=P1^0;             //PWM波形输出
sbit DR=P1^1;              //方向控制
#define  timer_data  (256-100) //定时器预置值,12M时钟是,定时0.1ms
#define  PWM_T 100         //定义PWM的周期T为10ms
unsigned char PWM_t;       //PWM_t为脉冲宽度(0~100)时间为0~10ms
unsigned char PWM_count;   //输出PWM周期计数
unsigned char time_count;  //定时计数
bit direction;             //方向标志为
//--------------------------------------------------------------------------------------------------
// 函数名称:timer_init
// 函数功能:初始化设施定时器
//--------------------------------------------------------------------------------------------------
void timer_init()
     {
   TMOD=0x22; /*定时器1为工作模式2(8位自动重装),0为模式2(8位自动重装) */
      PCON=0x00;
      TF0=0;
      TH0=timer_data;   //保证定时时长为0.1ms
      TL0=TH0;
      ET0=1;
   TR0=1;            //开始计数
      EA=1;             //中断允许
   }
//--------------------------------------------------------------------------------------------------
// 函数名称:setting_PWM
// 函数功能:设置PWM的脉冲宽度和设定方向
//--------------------------------------------------------------------------------------------------
void setting_PWM()
      {
   if(PWM_count==0)  //初始设置
   {
   PWM_t=20;
   direction=1;
   }
   }
//--------------------------------------------------------------------------------------------------
// 函数名称:IntTimer0
// 函数功能:定时器中断处理程序
//--------------------------------------------------------------------------------------------------
void IntTimer0() interrupt 1
              {
     time_count++;
              DR=direction;
     if(time_count>=PWM_T)
              {
     time_count=0;
     PWM_count++;
     setting_PWM();  //每输出一个PWM波调用一次
     }
     if(time_count<PWM_t)
     PWM=1;
     else
     PWM=0;
     }
//--------------------------------------------------------------------------------------------------
// 函数名称:main
// 用户主函数
// 函数功能:主函数
//--------------------------------------------------------------------------------------------------
void main()
     {
  timer_init();
  setting_PWM();
  }


直流电机闭环控制Keil c51源代码

//-----------------------函数声明,变量定义--------------------------------------------------------
#include <reg51.h>
sbit INT_0 =P3^2;              // 将p3.2外部中断0
sbit pulse_A=P1^2;               // P1.2为脉冲A输入
sbit PWM=P1^0;                   //PWM波形输出
sbit DR=P1^1;                    //方向控制
//-----------------------预定义值--------------------------------------------------------
#define PWM_T 1800              //定义PWM的周期T为18ms
#define Ts    1000              //定义光电编码器采样时间为10ms
#define  timer_data  (256-10) //定时器预置值,12M时钟是,定时0.01ms
//-----------------------预设定值--------------------------------------------------------
bit direction;                  //方向标志位               用户设定
unsigned char R;                //需要得到的直流电机转速   用户设定
//-----------------------实际运行状态--------------------------------------------------------
bit real_direction;             //电机实际运行方向  
unsigned char Rr;               //直流电机实际转速
//-----------------------计算所得补偿状态------------------------------------------
bit    compensate_polarity;     //补偿极性
unsigned char dR;               //转速补偿
//-----------------------经补偿后得到的脉宽------------------------------------------
unsigned char PWM_t;            //PWM_t为脉冲宽度(320~400)时间为3.2~4.0ms
unsigned char PWM_count;        //输出PWM周期计数
//-----------------------各中间计数值------------------------------------------
unsigned char pulseB_count;     //脉冲计数
unsigned char time0_count;      //定时计数
unsigned char time1_count;      //定时计数
//--------------------------------------------------------------------------------------------------
// 函数名称:timer_init
// 函数功能:初始化设置定时器
//--------------------------------------------------------------------------------------------------
void timer_init()
     {
   TMOD=0x22; /*定时器1为工作模式2(8位自动重装),0为模式2(8位自动重装) */
      PCON=0x00;
      TF0=0;
      TH0=timer_data;   //保证定时时长为0.01ms
      TL0=TH0;
   TH1=timer_data;   //保证定时时长为0.01ms
      TL1=TH0;
      ET0=1;            //定时器0中断允许
   TR0=1;            //定时器0开始计数
   ET1=1;            //定时器1中断允许
   TR1=1;            //定时器1开始计数
      EA=1;             //中断允许
   }
//--------------------------------------------------------------------------------------------------
// 函数名称: INT0_init()
// 函数功能: 初始化设置
//            设定INT0的工作方式
//--------------------------------------------------------------------------------------------------
void INT0_init(void ) 
             {
    pulseB_count=0;        //脉冲计数器清零
              IT0=1;     //选择INT0为沿触发方式
              EX0=1;     //外部中断允许
              EA=1;      //系统中断允许
              }
//--------------------------------------------------------------------------------------------------
// 函数名称:setting_PWM
// 函数功能:设置PWM的脉冲宽度和设定方向
//--------------------------------------------------------------------------------------------------
void setting_PWM()
      {
 // direction=1;  //设定转动方向
 // R=540;        //设定转速
 // dR=0;         //转速补偿为零
 // calculate_PWM_t();      //重新计算脉宽
   }
//--------------------------------------------------------------------------------------------------
// 函数名称: calculate_PWM_t
// 入口参数: R需要得到的直流电机转速,dR转速补偿
// 出口参数: PWM_t为脉冲宽度(320~400)时间为3.2~4.0ms
// 函数功能: 计算脉冲宽度,PWM_t=R/150;
//--------------------------------------------------------------------------------------------------
void calculate_PWM_t()
              {
      if(compensate_polarity==1) //正补偿
               PWM_t=(R+dR)/150;
      else
       PWM_t=(R-dR)/150;        //负修正
      }
//--------------------------------------------------------------------------------------------------
// 函数名称: calculate_Rr
// 入口参数: pulseB_count脉冲计数
// 出口参数: Rr直流电机实际转速
// 函数功能: 计算实际转速
//--------------------------------------------------------------------------------------------------
void calculate_Rr()
              {
               Rr=pulseB_count/6;
      }
//--------------------------------------------------------------------------------------------------
// 函数名称: compensate_dR
// 入口参数: Rr直流电机实际转速
//            R需要得到的直流电机转速
// 出口参数: dR转速补偿
// 函数功能: 计算实际补偿值和补偿极性 ,根据不同的补偿算法重新设计
//--------------------------------------------------------------------------------------------------
void compensate_Rr()
              {
              Rr=1;
              if(Rr>R)
      compensate_polarity=0;     //补偿极性
     else
               compensate_polarity=1;
      }
//--------------------------------------------------------------------------------------------------
// 函数名称: INT0_intrupt
// 函数功能: 外部中断0处理程序
//--------------------------------------------------------------------------------------------------
void INT0_intrupt() interrupt 0 using 1
        {
  pulseB_count++;
        if(pulse_A==0)
          {  
          real_direction=1;  //若P1.2为低电平,则电机为正转,计数器N的值加1
          }
        else                //若为高电平,则电机为反转,计数器N值减l。
           {
            real_direction=1;
          }
}
//--------------------------------------------------------------------------------------------------
// 函数名称:IntTimer0
// 函数功能:定时器中断处理程序
//--------------------------------------------------------------------------------------------------
void IntTimer0() interrupt 1
              {
     time0_count++;
              DR=direction;
     if(time0_count>=PWM_T)
              {
     time0_count=0;
     PWM_count++;
     setting_PWM();  //每输出一个PWM波调用一次
     }
     if(time0_count<PWM_t)
     PWM=1;
     else
     PWM=0;
     }
//--------------------------------------------------------------------------------------------------
// 函数名称:IntTimer1
// 函数功能:定时器中断处理程序
//--------------------------------------------------------------------------------------------------
void IntTimer1() interrupt 3
              {
     time1_count++;
     if(time1_count==1)
              {
     INT0_init();           //初始化外部中断设置
     }
     if(time1_count>=Ts)
     {
     time1_count=0;          //一个补偿周期结束,计数器清零
     calculate_Rr();         //计算实际转速
     compensate_Rr();        //计算实际补偿值和补偿极性
     calculate_PWM_t();      //重新计算脉宽
     }
     }
//--------------------------------------------------------------------------------------------------
// 函数名称:main
// 用户主函数
// 函数功能:主函数
//--------------------------------------------------------------------------------------------------
void main()
     {
     direction=1;  //设定转动方向
  R=540;        //设定转速
  dR=0;         //转速补偿为零
  calculate_PWM_t();      //重新计算脉宽
  timer_init();
  }


Tags:keilc,直流电机控制  
责任编辑:admin
请文明参与讨论,禁止漫骂攻击,不要恶意评论、违禁词语。 昵称:
1分 2分 3分 4分 5分

还可以输入 200 个字
[ 查看全部 ] 网友评论
    没有任何评论
推荐文章
閻㈤潧鐡欏鈧崣鎴犵秹閿涙碍鐪归梿鍡欐偅閸氬牆鎮囩猾鑽ゆ暩鐎涙劕鍩楁担婊€绗岄悽浣冪熅閸ュ墽娈戠純鎴犵彲閿涘lc瀹搞儲甯堕幎鈧張锟�,濡紕鏁搁弫鎵暩閻儴鐦�,閸楁洜澧栭張绡岲A缁涘鐡戦敍浣藉疮閽€鍐暩鐠侯垰娴樼純鎴犵彲缁儳宕曢敍灞艰礋瀹搞儳鈻肩敮鍫濆灡闁姳鐜崐绗衡偓鍌涱偨鏉╁骸鍙у▔銊ヤ簳娣団€冲彆娴兼褰块敍姘辨暩鐎涙劕绱戦崣鎴犵秹閿涳拷
最新推荐
鐠у嫭鏋¢崠鍛瑓鏉烇拷
 [闂佸憡顨嗗ú婊勬櫠閺嶎厼瀚夊Δ锕佹硶閵堫偊鏌¢崒锔藉]闂佸憡銇炵粈渚€濡垫径灞稿亾濞戝磭绱扮紒鍙樺嵆瀹曪繝寮撮悩宸毈闂佸搫鐗嗛幖顐︽偪閸曨剛鐟归柨鐕傛嫹100 c闁荤姴娴勯幏锟�
 [闂佹椿婢€缁插鎯岄悙顒傤浄閻犳亽鍔嶉崺鍌炴偣娴g懓绀冩い鎿勬嫹]LM324闁哄鏅滈崝鏍棘閿燂拷4~20mA闁哄鍎戦幏锟�1~5V闂佹眹鍨归悘姘辩矈閿燂拷
 [闂佹椿婢€缁插鎯岄悙顒傤浄閻犳亽鍔嶉崺鍌炴偣娴g懓绀冩い鎿勬嫹]LM386婵$偛婀辩划顖炴倵椤掍焦濯撮柟鎹愵嚙椤斿﹪鏌涜箛鎿冨剶妞ゃ儲鎹囧銊╁箚瑜嬫禍锝夋煕閿濆啫濡奸悽顖ゆ嫹
 [闂佹椿婢€缁插鎯岄悙顒傤浄閻犳亽鍔嶉崺鍌炴偣娴g懓绀冩い鎿勬嫹]936闂佺粯甯掗敃銈堛亹閹绢喗鍋ㄥù锝呭暟閻斿懘鏌涘Ο鐓庢灁闁诡喖锕畷鍫曟晸閿燂拷
 [闂佸憡顨嗗ú婊勬櫠閺嶎厼瀚夊Δ锕佹硶閵堫偊鏌¢崒锔藉]闁烩剝甯掗幊搴ㄦ晬閹邦兘鏋栭柕蹇ョ磿閵堟挳鎮归悮瀛樺+濠电偞鎸撮弲娑氣偓鐧告嫹+闂佺缈伴崕鎾敆閻斿吋鍎嶉柛鏇ㄥ亜缁€锟�
 [闂備緡鍋呭銊╁极閵堝鍋ㄩ梻鍫熺〒閹藉秹鎮规担鐟扮妞ゆ挸鎲″ḿ顏堫敍濞嗘劦鍋�]S7-200PLC闂佹眹鍔岀€氼亞鎸掗姀銈嗗剳闁绘梹妲掗幏顐⒚归悪鍛 S7_2
 [闁哄鍎愰崹顖氣枎閵忋垻灏甸柨鐕傛嫹]S7-200闁圭厧鐡ㄩ幐濠氬几閸愨晝顩烽悹浣告贡缁€鍕煕韫囷絿鍘滅紒鎲嬫嫹,STEP7
 [闁哄鍎愰崹顖氣枎閵忋垻灏甸柨鐕傛嫹]ModbusPoll闂佸憡绮岄鐖媎busSalve闂佺ǹ楠忛幏锟�
 [闁哄鍎愰崹顖氣枎閵忋垻灏甸柨鐕傛嫹]STEP7濠碘槅鍨崜婵堚偓姘懇閺屽矁绠涢弬璺ㄦ▌婵炲濮伴崐鏇犺姳閿燂拷 Smart_
 [闁哄鍎愰崹顖氣枎閵忋垻灏甸柨鐕傛嫹]Modbus闁荤姴顑呴崯鎶芥儊椤栨粌鍨濋柛鎾楀倻瑙� v1.024 缂傚倷绶ら幏锟�
 [闁哄鍎愰崹顖氣枎閵忋垻灏甸柨鐕傛嫹]Modscan32闂佸憡绮岄鐖媎sim32,modb
 [闂佹椿婢€缁插鎯岄悙顒傤浄閻犳亽鍔嶉崺鍌炴偣娴g懓绀冩い鎿勬嫹]89c51闂佺ǹ绻愰ˇ閬嶆偟濞戙垹妫橀梺顐g闂嗗綊鏌i鍡楁珢缂佽鲸鐛otues
 [闂佹椿婢€缁插鎯岄悙顒傤浄閻犳亽鍔嶉崺鍌炴偣娴g懓绀冩い鎿勬嫹]婵炴垶鎸稿ú銈夊礋妤e啫鍌ㄩ柛鐐村Оotues婵炲濮惧▔鏇烇耿閿涘嫮鐭欓悗锝庝簽绾板秵绻濊閸旀鎮ラ敓锟�
 [闂佹椿婢€缁插鎯岄悙顒傤浄閻犳亽鍔嶉崺鍌炴偣娴g懓绀冩い鎿勬嫹]51闂佸憡顨嗗ú婊勬櫠閺嶎厼瀚夐柛婵嗗閸у﹦绱掔€h埖瀚� protues婵炲濮惧▔鏇烇耿閿燂拷
 [闂佹椿婢€缁插鎯岄悙顒傤浄閻犳亽鍔嶉崺鍌炴偣娴g懓绀冩い鎿勬嫹]闂佸憡顨嗗ú婊勬櫠閺嶎厼瀚夐柨鐕傛嫹 PROTUES婵炲濮惧▔鏇烇耿閿涘嫧鍋撻崷顓炰粧缂佽翰鍎插鍕晸閿燂拷
热门文章
閺堚偓閺傜増鏋冪粩锟�
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 在线帮助 - 文章列表
返回顶部
刷新页面
下到页底
晶体管查询