5388|6

85

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

51单片机实现PWM线性调频脉冲信号提问? [复制链接]

我用的是AT89C52
想做到0.5KHZ~20KHZ之间精确线性调频脉冲信号,怎么也实现不了,以下是代码,请教一下高手意见!
/*****************************************************************************
* 程序名称:                                           *
* 编写时间:2008.9.27                                                        *
* 程序版本:1.0                                                              *
* 程序作者:夏寒冰                                                           *
* 开发单位:合肥工大高科信息技术有限责任公司(质检部)                       *
******************************************************************************/
//定时器计算公式:(65535-定时常数)*(12/晶振频率)=0.1MS
#include
#include
#include    //内部包含延时函数   _nop_();   



//TIME:0.1ms =1Khz
#define V_TH0  0Xff              
#define V_TL0  0X9c            
#define V_TMOD 0X51 //0x01


//I
sbit P1_0=P1^0; //LED
sbit P1_1=P1^1; //KEY++
sbit P1_2=P1^2; //KEY--
sbit P1_3=P1^3; //KEY Enter
//O
sbit SER=P1^4; //14
sbit clock=P1^5; //  
sbit latch=P1^6; // 12   
//输出显示
sbit CP1=P0^0; //CP
sbit EnMoto1=P0^1 ;//EN
sbit CW_CCW1=P0^2 ;//CW   

void init_sys(void);            /*系统初始化函数*/
void delay(void);
void showFour(int value);
int ScanKeyValue(void);

int item,xf=8;//角度索引,细分值
int cTime=0,xTime,tk=0,Count=0,SecValue;
bit Flat=0,Flat1=0;
int zkb1,Vn,Vn2,VMAX=9999,VMIN=100,DispValue; //占空比间隔0.1ms*Vn,当Vn=0时,定时器以0.1ms中断,定时器最大中断时间间隔为0.1*VMAX   
float FOS=0.0;//频率检测
//圆盘参数
idata float C0=301; //18个孔组合的圆周长 mm
idata float L0=20;  //18个孔之间角度

/*0~F之间模式选择字符*/
  unsigned char MODEL_7SEG[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
/*ERROR 字符 错误提示*/
unsigned char ERROR_7SEG[4]={0x86,0xaf,0xaf,0xa3};
              
//unsigned char F8DZ[8]={0x09,0x69,0x60,0x66,0x06,0x96,0x90,0x99};//8细分反转:A-AB'-B'-A'B'-A'-A'B-B-BA
//  unsigned char Z8DZ[8]={0x99,0x90,0x96,0x06,0x66,0x60,0x69,0x09};//8细分正转:BA-B-A'B-A'-A'B'-B'-AB'-A步距角为0.9度
//unsigned char F4DZ[4]={0x60,0x06,0x90,0x09};//4细分反转:B'-A'-B-A 步距角为1.8度
//unsigned char Z4DZ[5]={0x66,0x69,0x99,0x96,0x66};//4细分正转: A'B'-AB'-AB-A'B-A'B'
//unsigned char Z2DZ[2]={0x66,0x99};//2细分正转:A'B'-AB


void main()
{
idata float len=C0/360*L0; //小点间距弧长单位:mm  
init_sys();
Vn=100;
EnMoto1=1;//电机驱动打开

CW_CCW1=1;//正转

showFour(Vn);
delay();
Vn2=Vn;
cTime=(int)((float)1000/Vn2);
zkb1=(int)(cTime-(float)cTime/2);
Flat=0;
  while(1)
  {
    P1_1=P1_2=1;
        if(!P1_3||!P1_1||!P1_2)
    {
     Flat=1;
         SecValue=0;
        }
            
        if(Flat)
        {
     if(SecValue>=0&&SecValue<3)
     {
          if(!P1_3||!P1_1||!P1_2)
      showFour(ScanKeyValue());//
       if(!P1_3)
           {
             Vn2=Vn;               
                 cTime=(int)((float)1000/Vn2);
         zkb1=(int)(cTime-(float)cTime/2);
                }
      }
      else
      {
       Flat=0;
          }
         }
        else
        {
       SecValue=0;
       if(Flat1)
           {
            FOS=TH1*256+TL1;
        //        DispValue=(int)((FOS-FOS*0.13)*len);//速度=频率*最小弧长 (单位mm/s)       
            DispValue=len/(1000/(FOS-FOS*0.127))*1000;
        showFour(DispValue);
        TH1=TL1=0;Flat1=0;
           }
        }
  }//end while
}


//********************************************键盘扫描
int ScanKeyValue()
{
   if(!P1_1)
   {   
     while(!P1_1);
     { Vn+=10;
          if(Vn>=VMAX)
           {
            Vn=VMAX;            
           }
          }
        }
   else if(!P1_2)//KEY--
   {
    while(!P1_2);
     { Vn-=10;
           if(Vn<=VMIN)
            {
             Vn=VMIN;             
            }
         }
   }
   return (Vn);
}
/******************************************************
*函数功能:对系统进行初始化,包括定时器初始化和变量初始化*/
void init_sys(void)            /*系统初始化函数*/
{
  /*定时器初始化*/

  TMOD=V_TMOD;
  TH0=V_TH0;
  TL0=V_TL0;  
  //IE=0x82;
// TCON=0x00;
  TR0=1;
  TR1=1;//  
  ET0=1;
  EA=1;
}

void delay()
{
int i,j;
for(i=0;i<10;i++)
  for(j=0;j<10;j++);
}

/*****************************************
Model  控制 74HC595 显示数据送入7段数码中
*****************************************/
void show_model(unsigned char WriteValue)
{
        unsigned char TempValue;
        unsigned char i;
     latch=0;
        for(i=0;i<8;i++)//
        {
                clock=0;   //
                TempValue=(WriteValue<                 if(TempValue>=0x80)
                {
                        SER=1;
                }
                else
                {
                        SER=0;                       
                }
                _nop_();
                _nop_();
                clock=1;
                _nop_();
                _nop_();
        }
    latch=1;
}

/*****************************************
              显示四位数字
*****************************************/
void showFour(int value)
{   
   int  d,c,b,a,x;//d=千位  c=百位 b=十位 a=个位
   
         if(value>=0 && value<100000 )//识别0~9999之间十进制值为合法范围
         {d=value/1000;
          c=value/100-d*10;
          b=value/10-d*100-c*10;
          a=value%10;
          for(x=0;x<4;x++)
          {
           if(x==0)          
           {
            show_model(MODEL_7SEG[a]);//
            //_nop_();show_model(0xff);//
                }
           else
           {
           if(x==1)       
           {                    
                    show_model(MODEL_7SEG);//
                // _nop_();show_model(0xff);//
                }
            else
                {
                if(x==2)
                {                             
                 show_model(MODEL_7SEG[c]);//
                 
                 _nop_();
                  }
                else
                {
                 if(x==3)                                       
                 show_model(MODEL_7SEG[d]);//
                 
                 _nop_();
               }
         }               
   }
  }
}
else
{         //识别0~9999之间十进制值不为合法范围
  for(x=0;x<4;x++)
          {
           if(x==0)          
           {
            show_model(ERROR_7SEG[3]);//千位
            _nop_();
                }
           else
           {
           if(x==1)       
           {                    
                    show_model(ERROR_7SEG[2]);//百位
                 _nop_();
                }
            else
                {
                if(x==2)
                {                             
                  show_model(ERROR_7SEG[1]);//十位
                 _nop_();
                  }
                else
                {
                 if(x==3)                                       
                 show_model(ERROR_7SEG[0]);//个位
                 _nop_();
               }
         }               
   }
  }

}
  
}

/*定时器方式1中断函数*/
void timer0(void) interrupt 1 using 2
{
TH0=V_TH0;                                    
TL0=V_TL0;
if(xTime++>=cTime)
  xTime=0;
else
  if(tk++>=zkb1)
  {
   tk=0;  
   CP1=0;
   }
  else
  {
   CP1=1;
  }

if((Count++)>=10000)//when 1s
{
  Count=0;
  Flat1=1;
  SecValue++;  
P1_0=~P1_0;  
}

}

最新回复

如果你做一万个,你就感觉出这个何必在哪里了 呵呵   详情 回复 发表于 2008-11-10 23:39
点赞 关注

回复
举报

87

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
逻辑比较乱, 先把代码写利索点.

void showFour(int value) // 这个函数里面好像大括号都不配对
{  
  int  d,c,b,a,x;//d=千位  c=百位 b=十位 a=个位
   
  if(value>=0 && value <100000 )//识别0~9999之间十进制值为合法范围 // 如果int是16位,条件(value <100000)总是成立的 。





 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
LZ具体的代码上我就不看了

给你一个PWM在51上实现的方法

用一个定时器,专门做PWM

现在你的最快的是20KHz

这个在51上可以用自动重载方式直接算出来

然后呢0。5K正好是20K的倍数,或都反过来说吧

也就是说可以,在定时器里进行累加,得到输出可以在期间任意可调

应该完事了。。。

郁闷写到最后不想改了

好像PWM不叫调频

晕死
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

4
 
PWM叫脉宽调制,用51来做,吃饱了撑的,20K,算算10%以下占空比的时候你的定时器多少时间中断一次,估计你中断服务都没出来时间又到了。
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

5
 
靠,这是步进电机驱动的,想要实现的是线性调速,不是什么PWM,有没有搞错。
步进电机的转速不能太高的,不然会出现失步,你的频率这么高,它能跟上?
 
 
 

回复

123

帖子

0

TA的资源

一粒金砂(高级)

6
 
一些51核的单片机就有几路PWM输出,STC12XX STC54XX都专用几路PWM输出,
又不贵十来元,何必...
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

7
 
如果你做一万个,你就感觉出这个何必在哪里了

呵呵
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表