找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3062|回复: 2
收起左侧

PWM的DA转换没有理解

[复制链接]
ID:153715 发表于 2017-7-21 16:11 | 显示全部楼层 |阅读模式
本帖最后由 humeng 于 2017-7-21 16:34 编辑

/**************************************************************************************
*                              DA-PWM输出实验                                                                                                  *
实现现象:下载程序后DA模块上的指示灯呈呼吸灯效果,由暗变亮再由亮变暗
注意事项:要将AD/DA模块上的短接片将OUT和LED短接,板子丝印上有。
                  如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。                                                                                                                                                                  
***************************************************************************************/

#include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;

//--定义使用的IO口--//
sbit PWM=P2^1;
bit DIR;

//--定义一个全局变量--//
u16 count,value,timer1;//count设置占空比,timer1设置周期

/*******************************************************************************
* 函 数 名         : Timer1Init
* 函数功能                   : 定时器1初始化
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Timer1Init()
{
        TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。

        TH1 = 0xFF;
        TL1 = 0xff;   //1us
               
        ET1=1;//打开定时器1中断允许
        EA=1;//打开总中断
        TR1=1;//打开定时器                        
}


/*******************************************************************************
* 函 数 名       : main
* 函数功能                 : 主函数
* 输    入       : 无
* 输    出             : 无
*******************************************************************************/
void main()
{        
        Timer1Init();  //定时器1初始化
        while(1) //这个循环里面都没有理解,就是不知道在一个周期内,timer1,count,value都是怎么变化的,三者之间有什么关系
        {
                if(count>100)                //不知道count是怎么来控制占空比的                                       
                {  
                        count=0;
                        if(DIR==1)                                           //DIR控制增加或减小
                        {
                          value++; //value自加时,count在变化吗?timer1还在继续增加吗?
                        }                        
                        if(DIR==0)
                        {
                          value--;
                        }
                                
                }

                if(value==1000)
                {
                  DIR=0;
                }
                if(value==0)
                {
                  DIR=1;
                }        
                                
                if(timer1>1000)  //PWM周期为1000*1us
                {
                        timer1=0;
                }
                if(timer1 <value)        
                {
                        PWM=1;
                }
                else
                {
                        PWM=0;
                }               
        }               
}

/*******************************************************************************
* 函 数 名       : Time1
* 函数功能                 : 定时器1的中断函数
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/

void Time1(void) interrupt 3    //3 为定时器1的中断号  1 定时器0的中断号 0 外部中断1 2 外部中断2  4 串口中断
{
        TH1 = 0xFF;
        TL1 = 0xff;   //1us
        timer1++;
    count++;
        
}


回复

使用道具 举报

ID:149988 发表于 2017-7-22 07:41 | 显示全部楼层

RE: PWM的DA转换没有理解

timer1,count是在定时器T1中断服务程序中自加,T1中断是不断进行的,也就是到了定时时间,中断即发生。每中断一次,timer1,count完成自加一次,当count>100时,count清零。当value==1000时,value清零。而value的加减是由DIR来决定的,当DIR==1时value++,当DIR==0时value--。占空比是由timer1 和value的大小共同决定的。
回复

使用道具 举报

ID:153715 发表于 2017-7-29 14:32 | 显示全部楼层
不倒翁.WZT 发表于 2017-7-22 07:41
timer1,count是在定时器T1中断服务程序中自加,T1中断是不断进行的,也就是到了定时时间,中断即发生。每中 ...

既然你说占空比是由timer1和value的大小共同决定的,那么count有什么用了?您能不能具体说明下在一个周期内timer1和count、value是怎么变化的?比如刚开始时,count和timer1都在自加,当count自加到100时,这时timer1=100,当count=101时,timer1=101,这时count>100,count=0,由于刚开始value=0,所以DIR=1,value开始自加,“value在自加的过程中,timer1还在自加吗?count重新从0开始自加吗?自加过程中是怎么比较大小的?”就是这个过程没有理解,希望可以解答一下,谢谢
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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