打印

写过STC12系列PWM控制电机程序进。。

[复制链接]
9536|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xw13668|  楼主 | 2009-9-29 16:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
xw13668|  楼主 | 2009-9-29 17:05 | 只看该作者
控制直流电机啊 那位大侠可以帮助下。。。。

使用特权

评论回复
板凳
853491549| | 2011-7-31 09:01 | 只看该作者
#include<stc12.h>
unsigned char i,pwm;
unsigned char table[5]={0xf3,0xec,0xd6,0xec,0xf3};

void pwm_set(unsigned char a);
void intimer();
void initpwm();
void main()
{
initpwm();
intimer();
num=0;
pwm=0;
while(1)
{
   if(i==40)
  {
   i=0;
   pwm_set(table[pwm++]);
   if(pwm==5)
   pwm=0;
  }
}

}
void initpwm()
{
CCON=0;
CL=0;
CH=0;
CMOD=0X04;//设定Pwm时钟频率为定时器0
CCAPM0=0X42;
PCA_PWM0=0X00;
CCAP0H=0;
CCAP0L=0xd9;
CR=1;
}

void pwm_set(unsigned char a)
{
CCAP0H=a;
}

void intimer() //定时器0工作在1t模式提供PWM时钟频率定时器1用于定时刷新占空比
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TH0=(65536-156)/256;
TL0=(65536-156)%256;
TMOD=0x12;
AUXR=0x00;
ET0=1;
ET1=1;
TR1=1;
TR0=1;
EA=1;
}

void exter0() interrupt 1
{
TH0=(65536-156)/256;
TL0=(65536-156)%256;

}
void timer1() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
i++;
}

使用特权

评论回复
评分
参与人数 2威望 +4 收起 理由
gnhxsk + 1 很给力!
ttl_web + 3 很给力!
地板
853491549| | 2011-7-31 09:01 | 只看该作者
main.c



#include <REG51.H>
#include <intrins.h>
#define U8 unsigned char
#define U16 unsigned int

void DelayMs(U8 ms);
void PWM_clock(U8 clock);
void PWM_start(U8 module,U8 mode);

////////////////////// 延时子程序/////////////////////////////
void DelayMs(U8 ms) //在11.0592M晶振下,stc10f系列(单周期指令)的ms级延时
{      
U16 i;
while(ms--)
{
   for(i = 0; i < 850; i++);
}
}


////////////////////主函数入口////////////////////////////

sfr CCON     = 0xD8; //PCA控制寄存器
sfr CMOD     = 0xD9; //PCA模式寄存器
sfr CCAPM0   = 0xDA; //PCA模块0模式寄存器 //模块0对应P1.3/CEX0/PCA0/PWM0(STC12C5A60S2系列)   
sfr CCAPM1   = 0xDB; //PCA模块1模式寄存器 //模块1对应P1.4/CEX1/PCA1/PWM1(STC12C5A60S2系列)
sfr CL       = 0xE9;    //PCA 定时寄存器 低位
sfr CH       = 0xF9; //PCA 定时寄存器 高位
sfr CCAP0L   = 0xEA; //PCA模块0的 捕获寄存器 低位
sfr CCAP0H   = 0xFA;    //PCA模块0的 捕获寄存器 高位
sfr CCAP1L   = 0xEB; //PCA模块1的 捕获寄存器 低位
sfr CCAP1H   = 0xFB; //PCA模块1的 捕获寄存器 高位
sfr PCA_PWM0 = 0xF2; //PCA PWM 模式辅助寄存器0
sfr PCA_PWM1 = 0xF3; //PCA PWM 模式辅助寄存器1
sbit CF   = 0xDF;     //PCA计数溢出标志位
sbit CR   = 0xDE;     //PCA计数器 运行控制位
sbit CCF1 = 0xD9;     //PCA模块1中断标志
sbit CCF0 = 0xD8;     //PCA模块0中断标志

//* CCAPOH = CCAPOL = 0XC0; //模块0输出 占空因数为25%
//* CCAPOH = CCAPOL = 0X80; //模块0输出 占空因数为50%
//* CCAPOH = CCAPOL = 0X40; //模块0输出 占空因数为75%

void PWM_clock(U8 clock);
void PWM_start(U8 module,U8 mode);

void PWM_clock(U8 clock)
{
CMOD |= (clock<<1);
CL = 0x00;
CH = 0x00;
}

void PWM_start(U8 module,U8 mode)
{
CCAP0L = 0XC0;
CCAP0H = 0XC0;   //模块0初始输出 占空因数为25%
CCAP1L = 0XC0;
CCAP1H = 0XC0;   //模块1初始输出 占空因数为25%

if(module==0)
   {
    switch(mode)
     {
   case 0: CCAPM0 = 0X42;break; //模块0设置为8位PWM输出,无中断
   case 1: CCAPM0 = 0X53;break; //模块0设置为8位PWM输出,下降沿产生中断
   case 2: CCAPM0 = 0X63;break; //模块0设置为8位PWM输出,上升沿产生中断
   case 3: CCAPM0 = 0X73;break; //模块0设置为8位PWM输出,跳变沿产生中断
   default: break;
   }
}
else
    if(module==1)
     {
      switch(mode)
       {
   case 0: CCAPM1 = 0X42;break; //模块1设置为8位PWM输出,无中断
   case 1: CCAPM1 = 0X53;break; //模块1设置为8位PWM输出,下降沿产生中断
   case 2: CCAPM1 = 0X63;break; //模块1设置为8位PWM输出,上升沿产生中断
   case 3: CCAPM1 = 0X73;break; //模块1设置为8位PWM输出,跳变沿产生中断
   default: break;
   }
   }
   else
     if(module==2)
        {
        switch(mode)
    {
      case 0: CCAPM0 = CCAPM1 = 0X42;break; //模块0和1设置为8位PWM输出,无中断
      case 1: CCAPM0 = CCAPM1 = 0X53;break; //模块0和1设置为8位PWM输出,下降沿产生中断
      case 2: CCAPM0 = CCAPM1 = 0X63;break; //模块0和1设置为8位PWM输出,上升沿产生中断
      case 3: CCAPM0 = CCAPM1 = 0X73;break; //模块0和1设置为8位PWM输出,跳变沿产生中断
      default: break;
      }
       }
CR=1; //PCA计数器开始计数
}

void PCA_Intrrpt(void) interrupt 7
{
if(CCF0) CCF0=0;
if(CCF1) CCF1=0;   //软件清零
if(CF)   CF=0;    //软件清零
}


void main()
{
TMOD|=0x02; /* timer 0 mode 2: 8-Bit reload */
TH0=0xff;
TR0=1;     
PWM_clock(2);      // PCA/PWM时钟源为 定时器0的溢出
PWM_start(0,0); // 模块0,设置为PWM输出,无中断,初始占空因素为25%
while(1)
   {
    DelayMs(250);
   }
}

使用特权

评论回复
5
853491549| | 2011-7-31 09:02 | 只看该作者
#include <intrins.h>
#define U8 unsigned char

sfr CCON     = 0xD8; //PCA控制寄存器
sfr CMOD     = 0xD9; //PCA模式寄存器
sfr CCAPM0   = 0xDA; //PCA模块0模式寄存器 //模块0对应P1.3/CEX0/PCA0/PWM0(STC12C5A60S2系列)   
sfr CCAPM1   = 0xDB; //PCA模块1模式寄存器 //模块1对应P1.4/CEX1/PCA1/PWM1(STC12C5A60S2系列)
sfr CL       = 0xE9;    //PCA 定时寄存器 低位
sfr CH       = 0xF9; //PCA 定时寄存器 高位
sfr CCAP0L   = 0xEA; //PCA模块0的 捕获寄存器 低位
sfr CCAP0H   = 0xFA;    //PCA模块0的 捕获寄存器 高位
sfr CCAP1L   = 0xEB; //PCA模块1的 捕获寄存器 低位
sfr CCAP1H   = 0xFB; //PCA模块1的 捕获寄存器 高位
sfr PCA_PWM0 = 0xF2; //PCA PWM 模式辅助寄存器0
sfr PCA_PWM1 = 0xF3; //PCA PWM 模式辅助寄存器1
sbit CF   = 0xDF;     //PCA计数溢出标志位
sbit CR   = 0xDE;     //PCA计数器 运行控制位
sbit CCF1 = 0xD9;     //PCA模块1中断标志
sbit CCF0 = 0xD8;     //PCA模块0中断标志

//* CCAPOH = CCAPOL = 0XC0; //模块0输出 占空因数为25%
//* CCAPOH = CCAPOL = 0X80; //模块0输出 占空因数为50%
//* CCAPOH = CCAPOL = 0X40; //模块0输出 占空因数为75%

void PWM_clock(U8 clock);
void PWM_start(U8 module,U8 mode);

void PWM_clock(U8 clock)
{
CMOD |= (clock<<1);
CL = 0x00;
CH = 0x00;
}

void PWM_start(U8 module,U8 mode)
{
CCAP0L = 0XC0;
CCAP0H = 0XC0;   //模块0初始输出 占空因数为25%
CCAP1L = 0XC0;
CCAP1H = 0XC0;   //模块1初始输出 占空因数为25%

if(module==0)
   {
    switch(mode)
     {
   case 0: CCAPM0 = 0X42;break; //模块0设置为8位PWM输出,无中断
   case 1: CCAPM0 = 0X53;break; //模块0设置为8位PWM输出,下降沿产生中断
   case 2: CCAPM0 = 0X63;break; //模块0设置为8位PWM输出,上升沿产生中断
   case 3: CCAPM0 = 0X73;break; //模块0设置为8位PWM输出,跳变沿产生中断
   default: break;
   }
}
else
    if(module==1)
     {
      switch(mode)
       {
   case 0: CCAPM1 = 0X42;break; //模块1设置为8位PWM输出,无中断
   case 1: CCAPM1 = 0X53;break; //模块1设置为8位PWM输出,下降沿产生中断
   case 2: CCAPM1 = 0X63;break; //模块1设置为8位PWM输出,上升沿产生中断
   case 3: CCAPM1 = 0X73;break; //模块1设置为8位PWM输出,跳变沿产生中断
   default: break;
   }
   }
   else
     if(module==2)
        {
        switch(mode)
    {
      case 0: CCAPM0 = CCAPM1 = 0X42;break; //模块0和1设置为8位PWM输出,无中断
      case 1: CCAPM0 = CCAPM1 = 0X53;break; //模块0和1设置为8位PWM输出,下降沿产生中断
      case 2: CCAPM0 = CCAPM1 = 0X63;break; //模块0和1设置为8位PWM输出,上升沿产生中断
      case 3: CCAPM0 = CCAPM1 = 0X73;break; //模块0和1设置为8位PWM输出,跳变沿产生中断
      default: break;
      }
       }
CR=1; //PCA计数器开始计数
}

void PCA_Intrrpt(void) interrupt 7
{
if(CCF0) CCF0=0;
if(CCF1) CCF1=0;   //软件清零
if(CF)   CF=0;    //软件清零
}

使用特权

评论回复
6
autopccopy| | 2011-7-31 09:44 | 只看该作者
顶! :)

使用特权

评论回复
7
fenglife| | 2012-8-1 15:46 | 只看该作者
看得有点晕

使用特权

评论回复
8
dlyt_test001| | 2012-8-1 16:07 | 只看该作者
支持,顶!

使用特权

评论回复
9
gnhxsk| | 2014-10-3 17:06 | 只看该作者
顶,不错

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

28

帖子

0

粉丝