sdf159372008 发表于 2011-12-29 23:25:31

求助,STc12C5A60S2自带的PWM

网上看了STc12C5A60S2看了一些资料,自己也找了一些程序,但是对于一个接触单片机3个月,程序只会IF来,IF去的新手,压力还是巨大的~


STc12C5A60S2内部自带PWM,而且能定义到传说中的P4口,请问,这个用C语言要如何定义呢?可否来一段注释详细的程序?网上找的只有略有提及,通俗一点说,就是我看不懂。
这个PWM的频率程序里面应该要如何计算?能达到25Khz么(不用这么精确,20-30Khz我都可以接受)?
这个PWM和中断,定时器,延时函数之间有没有什么关系呢?有这些函数会不会影响到PWM的频率?


一下是我在网上找到的一段程序,据说是用到内部硬件PWM的程序,大家帮忙看看,为小弟解解惑~
/**************************************************************
用STC12C5A60S2控制直流电机,PWM控制转速,按键s1、s2控制加速减速
因只控制一路电机所以只用到一路PWM,若用到两路则打开另一路即可
晶振为22.1184MHz,使用其他晶振时把延时函数改一下即可。
***************************************************************/

#include<STC12C5A60S2.H> //头文件

sbit s1 = P3^6;//加速控制       
sbit s2 = P3^7;//减速控制
sbit R1 = P0^3;
sbit R2 = P0^4;//R1和R2控制转向,一个高电平一个低电平

unsigned int z;

void delay_ms(unsigned int time)
{
        int x,y;
        for(x=time;x>0;x--)
       for(y=229;y>0;y--);
}


void PWM_init (void)
{
        CMOD=0x02; //设置PCA定时器
        CL=0x00;
        CH=0x00;
        CCAPM0=0x42; //PWM0设置PCA工作方式为PWM方式(0100 0010)
        CCAP0L=0x00; //设置PWM0初始值与CCAP0H相同
        CCAP0H=0x00; // PWM0初始时为0

        CCAPM1=0x42; //PWM1设置PCA工作方式为PWM方式(使用时删除//)
        CCAP1L=0x00; //设置PWM1初始值与CCAP0H相同
        CCAP1H=0x00; // PWM1初始时为0

        CR=1; //启动PCA定时器
}
/**********************************************************************************************/

/*********************************************************************************************
函数名:PWM0占空比设置函数
调用:PWM0_set();
参数:0x00~0xFF(亦可用0~255)
返回值:无
结果:设置PWM模式占空比,为0时全部高电平,为1时全部低电平
备注:如果需要PWM1的设置函数,只要把CCAP0L和CCAP0H中的0改为1即可
/**********************************************************************************************/
void PWM0_set (unsigned char a)
{
        CCAP0L= a; //设置值直接写入CCAP0L
        CCAP0H= a; //设置值直接写入CCAP0H
}
/*
void PWM1_set (unsigned char a)
{
        CCAP1L= a; //设置值直接写入CCAP0L
        CCAP1H= a; //设置值直接写入CCAP0H

}*/
/**********************************************************************************************/


void main ()
{

        PWM_init(); //PWM初始化
        R1 = 0;
        R2 = 1;
        PWM0_set (1);
        z = 1;
        while(1)
        {
                        if(s1==0)
                        {
                                delay_ms(500);
                                if(s1==0)
                                {
                                        z++;
                                        PWM0_set (z);
                                        if(z > 254)                                  
                                        {
                                           z=254;
                                        }
                                }
                        }                  
                        if(s2==0)
                        {
                                delay_ms(500);
                                if(s2==0)
                                {
                                        z--;
                                        PWM0_set (z);
                                        if(z < 1)                                  
                                        {
                                           z=1;
                                        }
                                }
                        }
        }
}

Pony279 发表于 2011-12-30 01:12:15

STC的datasheet上有说...

学单片机不会看datasheet, 跟没学没什么两样,

谁都会baidu谁都会google谁都会上论坛来发问, 其实有些东西datasheet上已经写得很清楚了

xiaobendan 发表于 2011-12-30 08:31:59

同楼上

xuqiunan 发表于 2012-3-10 17:53:19

mark

zhenglang 发表于 2014-5-19 22:00:09

Pony279 发表于 2011-12-30 01:12
STC的datasheet上有说...

学单片机不会看datasheet, 跟没学没什么两样,


data......是使用说明么

不羁的风 发表于 2014-5-19 23:10:15

参见STC 12C5A60S2 datasheet 第362页,可在STC官网上下载到。
PCA_P4=1;或 AUXR1=0X40; 即可。

mobile02 发表于 2014-5-24 20:49:22

请问死区怎么设定?听说 STC 没有死区功能
页: [1]
查看完整版本: 求助,STc12C5A60S2自带的PWM