数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 3280|回复: 2

[C51] PWM 1000-2000电调测试代码

[复制链接]
发表于 2021-10-8 14:51:13 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
//24.000MHz
// 改变num,来改变占空比
//有的电调是1000~2000us,中间值是1500us(可以认为是静止状态)
// (如果有干扰影响,就注释掉演示的部分,再测验)

#include<reg52.h>
sfr AUXR  = 0x8e;            //辅助寄存器

#define T    8                //定时器中断周期(us),精度直接影响PWM的精度,特别是中间值,需要细调。
unsigned int pp;
#define MAX  20000/T        //20000us/定时器1中断时间, 频率周期
#define MaxP 2000/T            //电调最大PWM 2000us/定时器1中断时间
#define MinP 1000/T            //电调最小PWM 1000us/定时器1中断时间
#define MidP 1500/T            //电调中间PWM 1500us/定时器1中断时间
unsigned int num=MidP;        //电调变量,默认取中间值
sbit pwm  = P3^3;            //PWM输出
sbit s2   = P3^2;            //增按键
sbit s3   = P3^5;            //减按键

//==================================================
//这些是演示使用的
bit dir=0;
unsigned int cnt=0;
void Timer0Init(void){        //1毫秒@11.0592MHz
    AUXR |= 0x80;            //定时器时钟1T模式
    TMOD &= 0xF0;            //设置定时器模式
    TL0   = 0xCD;            //设置定时初始值
    TH0   = 0xD4;            //设置定时初始值
    TF0   = 0;                //清除TF0标志
    TR0   = 1;                //定时器0开始计时
    ET0   = 1;
}
void tm0_isr() interrupt 1{
    cnt++;
}
//=============================================

void Delay1ms(unsigned int n){    //1ms@24MHz
    unsigned char i, j;
    while(n--){
        i = 24;
        j = 84;
        do{
            while (--j);
        } while (--i);
    }
}

void Timer1Init(void){        //PWM定时器
    AUXR |= 0x40;            //定时器时钟1T模式
    TMOD &= 0x0F;            //设置定时器模式
    TL1   = 0x40;            //8 微秒@24.000MHz
    TH1   = 0xFF;            //设置定时初始值
    TF1   = 0;                //清除TF1标志
    TR1   = 1;                //定时器1开始计时
    ET1   = 1;                //开定时器0中断
    EA    = 1;                //开总中断
}

void keyscan(){
    if(s2==0){
        Delay1ms(1);
        while(0==s2);
        if(num<MaxP) num+=5;
    }
    if(s3==0){
        Delay1ms(1);
        while(0==s2);
        if(num>MinP) num-=5;
    }
}

void main(){
    Delay1ms(100);
    Timer1Init();            //PWM定时器
    Timer0Init();            //演示定时器
    while(1){
        // keyscan();
        pwm=(pp<num)?1:0;
        //演示代码
        if(cnt==400){
            if(0==dir){
                num-=5;
                if(num<MinP){
                    pp=0;
                    num=MidP;
                    dir=1;
                    cnt++;//给机会暂缓
                }else{
                    cnt=0;
                }
               
            }else if(1==dir){
                num+=5;
                if(num>=MaxP){
                    pp=0;
                    num=MidP;
                    dir=0;
                    cnt++;//给机会暂缓
                }else{
                    cnt=0;
                }
            }
            
        }else if(cnt>=4500){    //暂缓一下
            cnt=0;
        }
        //演示代码结束
    }
}

void Timer1_isr(void) interrupt 3 using 1{
    pp++;
    if(pp==MAX){
        pp=0;
    }
}

//代码简单
//仅作测试,懂的TX很容易修改、运行起来。

//STC15F204EA,使用内置的时钟,测试过, 基本稳定


打赏

参与人数 1家元 +8 收起 理由
deyafe + 8 謝謝分享

查看全部打赏

 楼主| 发表于 2023-1-18 10:01:58 | 显示全部楼层


使用 STC15F204EA,使用内置时钟 ,本代码是测试,所以没什么外围,直接IO输出的。。。。除了那增减的按钮。

下载程序,连接电源+-、和串口P3^0、P3^1

所以,一共5个Pins连接
回复 支持 反对

使用道具 举报

发表于 2023-1-18 00:29:11 | 显示全部楼层
楼主,你这个代码有电路图参考吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-20 16:25 , Processed in 0.202800 second(s), 15 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表