打印

stc15fxxx系列 关于用time1,座pwm输出的功能

[复制链接]
2388|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hgl19870627|  楼主 | 2015-7-29 13:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个官方提供的案例,里面是做了一个变频p3.4变频输出的小程序,本人想改成固定频率的可控占空比的功能,但是看不懂他频率算法占空比算法。新人求指教,在线等啊

#define         MAIN_Fosc                22118400L                //定义主时钟

#define                PWM_DUTY                6000                        //定义PWM的周期,数值为时钟周期数,假如使用24.576MHZ的主频,则PWM频率为6000HZ。

#define                PWM_HIGH_MIN        32                                //限制PWM输出的最小占空比。用户请勿修改。
#define                PWM_HIGH_MAX        (PWM_DUTY-PWM_HIGH_MIN)        //限制PWM输出的最大占空比。用户请勿修改。

typedef         unsigned char        u8;
typedef         unsigned int        u16;
typedef         unsigned long        u32;

sfr P1M1 = 0x91;        //P1M1.n,P1M0.n         =00--->Standard,        01--->push-pull                实际上1T的都一样
sfr P1M0 = 0x92;        //                                        =10--->pure input,        11--->open drain
sfr P0M1 = 0x93;        //P0M1.n,P0M0.n         =00--->Standard,        01--->push-pull
sfr P0M0 = 0x94;        //                                        =10--->pure input,        11--->open drain
sfr P2M1 = 0x95;        //P2M1.n,P2M0.n         =00--->Standard,        01--->push-pull
sfr P2M0 = 0x96;        //                                        =10--->pure input,        11--->open drain
sfr P3M1  = 0xB1;        //P3M1.n,P3M0.n         =00--->Standard,        01--->push-pull
sfr P3M0  = 0xB2;        //                                        =10--->pure input,        11--->open drain
sfr P4M1  = 0xB3;        //P4M1.n,P4M0.n         =00--->Standard,        01--->push-pull
sfr P4M0  = 0xB4;        //                                        =10--->pure input,        11--->open drain
sfr P5M1   = 0xC9;        //        P5M1.n,P5M0.n         =00--->Standard,        01--->push-pull
sfr P5M0   = 0xCA;        //                                        =10--->pure input,        11--->open drain
sfr P6M1   = 0xCB;        //        P5M1.n,P5M0.n         =00--->Standard,        01--->push-pull
sfr P6M0   = 0xCC;        //                                        =10--->pure input,        11--->open drain
sfr        P7M1   = 0xE1;
sfr        P7M0   = 0xE2;



sfr        AUXR  = 0x8E;
sfr INT_CLKO = 0x8F;

sbit        P_PWM = P3^4;                //定义PWM输出引脚。

u16                pwm;                                //定义PWM输出高电平的时间的变量。用户操作PWM的变量。

u16                PWM_high,PWM_low;        //中间变量,用户请勿修改。

void          delay_ms(u8 ms);
void        LoadPWM(u16 i);


/******************** 主函数**************************/
void main(void)
{
        P0M1 = 0;        P0M0 = 0;        //设置为准双向口
        P1M1 = 0;        P1M0 = 0;        //设置为准双向口
        P2M1 = 0;        P2M0 = 0;        //设置为准双向口
        P3M1 = 0;        P3M0 = 0;        //设置为准双向口
        P4M1 = 0;        P4M0 = 0;        //设置为准双向口
        P5M1 = 0;        P5M0 = 0;        //设置为准双向口
        P6M1 = 0;        P6M0 = 0;        //设置为准双向口
        P7M1 = 0;        P7M0 = 0;        //设置为准双向口

        P_PWM = 0;
        P3M1 &= ~(1 << 4);        //P3.4 设置为推挽输出
        P3M0 |=  (1 << 4);

        TR1 = 0;                //停止计数
        ET1 = 1;                //允许中断
        PT1 = 1;                //高优先级中断

        TMOD &= ~0x30;        //工作模式,0: 16位自动重装
        AUXR |=  0x40;        //1T

        TMOD &= ~0x40;        //定时
        INT_CLKO |=  0x02;        //输出时钟

        TH1 = 0;
        TL1 = 0;
        TR1 = 1;        //开始运行

        EA = 1;

        pwm = PWM_DUTY/10 ;        //给PWM一个初值,这里为10%占空比
        LoadPWM(pwm);                        //计算PWM重装值


        while (1)
        {
                /*
                while(pwm < (PWM_HIGH_MAX-8))
                {
                        pwm += 8;                //PWM逐渐加到最大
                        LoadPWM(pwm);
                        delay_ms(8);
                }
                while(pwm > (PWM_HIGH_MIN+8))
                {
                        pwm -= 8;        //PWM逐渐减到最小
                        LoadPWM(pwm);
                        delay_ms(8);
                }
                */
                LoadPWM(pwm);
        }
}


//========================================================================
// 函数: void  delay_ms(u8 ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注:
//========================================================================
void  delay_ms(u8 ms)
{
     unsigned int i;
         do{
              i = MAIN_Fosc / 13000;
                  while(--i)        ;
     }while(--ms);
}

/**************** 计算PWM重装值函数 *******************/
void        LoadPWM(u16 i)
{
        u16        j;

        if(i > PWM_HIGH_MAX)                i = PWM_HIGH_MAX;        //如果写入大于最大占空比数据,则强制为最大占空比。
        if(i < PWM_HIGH_MIN)                i = PWM_HIGH_MIN;        //如果写入小于最小占空比数据,则强制为最小占空比。
        j = 65536UL - PWM_DUTY + i;        //计算PWM低电平时间
        i = 65536UL - i;                //计算PWM高电平时间
        EA = 0;
        PWM_high = i;        //装载PWM高电平时间
        PWM_low  = j;        //装载PWM低电平时间
        EA = 1;
}

/********************* Timer0中断函数************************/
void timer0_int (void) interrupt 3
{
        if(P_PWM)
        {
                TH1 = (u8)(PWM_low >> 8);        //如果是输出高电平,则装载低电平时间。
                TL1 = (u8)PWM_low;
        }
        else
        {
                TH1 = (u8)(PWM_high >> 8);        //如果是输出低电平,则装载高电平时间。
                TL1 = (u8)PWM_high;
        }
}

相关帖子

沙发
hgl19870627|  楼主 | 2015-7-29 13:13 | 只看该作者
在线等回复,求高手指教

使用特权

评论回复
板凳
hgl19870627|  楼主 | 2015-7-29 13:17 | 只看该作者
不明白,输出频率的算法,和占空比的算法

使用特权

评论回复
地板
专注于嵌入式| | 2015-7-29 13:28 | 只看该作者
哎。好好看数据手册,别光看历程。频率和占空比没有关系。输出频率是和输入时钟还有PWM的位数有关系的。

使用特权

评论回复
5
hgl19870627|  楼主 | 2015-7-29 13:43 | 只看该作者
好的。谢谢

使用特权

评论回复
6
hgl19870627|  楼主 | 2015-7-29 13:47 | 只看该作者
我了解到了输出频率的算法,那么占空比的算法呢,真新手,求解

使用特权

评论回复
7
hgl19870627|  楼主 | 2015-7-29 15:59 | 只看该作者
你好,手册中的TIME1输出时钟频率的关系式=主时钟/12(12分频)/65536-TH1,TL1/2. pwm的位数是怎么起作用的,能举个例子说明吗

使用特权

评论回复
8
hgl19870627|  楼主 | 2015-7-29 15:59 | 只看该作者
专注于嵌入式 发表于 2015-7-29 13:28
哎。好好看数据手册,别光看历程。频率和占空比没有关系。输出频率是和输入时钟还有PWM的位数有关系的。 ...

你好,手册中的TIME1输出时钟频率的关系式=主时钟/12(12分频)/65536-TH1,TL1/2. pwm的位数是怎么起作用的,能举个例子说明吗

使用特权

评论回复
9
any012| | 2015-7-29 16:44 | 只看该作者
本帖最后由 any012 于 2015-7-29 16:48 编辑

#define                PWM_DUTY                6000                        //定义PWM的周期,数值为时钟周期数,假如使用24.576MHZ的主频,则PWM频率为6000HZ。

#define                PWM_HIGH_MIN        32                                //限制PWM输出的最小占空比。用户请勿修改。
#define                PWM_HIGH_MAX        (PWM_DUTY-PWM_HIGH_MIN)        //限制PWM输出的最大占空比。用户请勿修改。
-------------------------
关系不是这几行吗?
菜鸟帮顶。
我觉得可以这样,PWM_HIGH_MIN设成变量而不是宏定义,你主程序里改变这个值就改变占空比。

我觉得原程序就是固定频率,占空比逐渐变化的啊。

使用特权

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

本版积分规则

1

主题

7

帖子

0

粉丝