求DSP产生可变占空比PWM波程序

求DSP产生可变占空比PWM波程序,第1张

用EVA事件管理器产生 重点看哈那张的内容 占空比有公式计算 自己动手做了才知道是怎么回事

/

文件名:EvPwm02c

功 能:PWM1和PWM2输出频率为1KHz的PWM波形。波形的占空比每隔1s变化5%,范围在10%

到90%之间。

说 明:EVA下面的通用定时器T1工作于连续增/减计数模式,产生对称的PWM波形。通过

T1的周期中断来计时,每隔1s钟改变1次占空比。死区时间为427us。

/

#include "DSP28_Deviceh"

#include "DSP28_Globalprototypesh"

Uint32 intcount;

int increase;

int decrease;

/

名 称:main()

功 能:初始化系统和各个外设

入口参数:无

出口参数:无

/

void main(void)

{

InitSysCtrl(); //初始化系统函数

DINT;

IER = 0x0000; //禁止CPU中断

IFR = 0x0000; //清除CPU中断标志

InitPieCtrl(); //初始化PIE控制寄存器

InitPieVectTable(); //初始化PIE中断向量表

InitGpio(); //初始化Gpio口

InitEv(); //初始化EV

intcount=0; //T1定时器周期中断计数器

increase=0; //占空比逐渐变小的变化趋势标志位

decrease=1; //占空比逐渐变大的变化趋势标志位

PieCtrlPIEIER2bitINTx4=1; //使能PIE中断,T1定时器中断位于INT24

IER|=M_INT2;

EINT; //开全局中断

ERTM; //开实时中断

EvaRegsT1CONbitTENABLE=1; //使能定时器T1计数 *** 作

while(1)

{

}

}

周期20毫秒,占空比5%~10%,所以高电平为1ms~2ms,以1%变化为调节量(200us)计算来设计程序。

#include<reg51h>

#define uchar unsigned char

sbit pwm=P1^0;

uchar u_p=5,num=0;

void t0isr() interrupt 1

{

num++;

if(num<=u_p)pwm=1;

if(num>u_p)pwm=0;

num%=100;

}

void uart() interrupt 4

{

if(RI)

{

RI=0;

u_p=SBUF;

}

}

main()

{

TMOD=0x22;

TH0=56;

TL0=56;

TH1=0xfd;

TL1=0xfd;

TR0=1;

TR1=1;

ET0=1;

ES=1;

EA=1;

pwm=1;

while(1);

}

首先89C52内部没有硬件PWM发生器,只能通过定时器模拟!你可以通过两个定时器,T0控制周期,T1控制占空比。

例如:实现周期为1000us,占空比为20%的PWM,用P10实现

首先你设置T0为65536-1000 (12M晶振)

T1为65536-200

首先初始化P10=1,两个定时器同时打开,在定时器T1中断时拉低P10,在定时器T0中断时在拉高P10,同时将两定时器初始值初始化T0为65536-1000 ,T1为65536-200

希望对你有用,呵呵!!!

用1个定时器的话也是可以的,但是这就要用一个变量count1 来控制周期和占空比了,比如说你设置1周期为10ms,占空比还是为20%的PWM,你可以设置定时器为每10us产生一次中断,没中断一次使count加1,一开始设置P10为高电平,当count1加到200的时候拉低P10,等count1到1000了在拉高P10,同时复位count1=0,不过这样做的缺点是精度不高,要是PWM所需周期段,精度高的话我还是建议用两个定时器来实现 ,我在这里没有给你具体的代码,我觉得把原理讲清楚猜是最重要的,什么都是才来就上代码,这个对你学习不利,希望对你有用,呵呵!!!!

如果两路同时输出的话只要你设置两个变量,同时进行判断就行了,和一路的原理是一样的。

MY8255_A EQU 9C60H

MY8255_B EQU 9C61H

MY8255_C EQU 9C62H

MY8255_MODE EQU 9C63H

CODE SEGMENT

ASSUME CS:CODE

START: MOV DX,MY8255_MODE

MOV AL,82H

OUT DX,AL

A1: MOV DX,MY8255_B

IN AL,DX

MOV DX,MY8255_A

OUT DX,AL

CALL BREAK

JMP A1

BREAK PROC NEAR

MOV AH,06H

MOV DL,0FFH

INT 21H

JE RETURN

MOV AX,4C00H

INT 21H

RETURN:RET

BREAK ENDP

CODE ENDS

END START

// 仿真实例 占空比可调

#include<reg51h>    // 用定时器0  控制 PWM

sbit P1_0 = P1^0;    // P10  PWM  输出

sbit key10 = P3^2;   // 调节 PWM0  占空比 按键

sbit key11 = P3^3;

unsigned char PWM0 = 2;     // 占空比调整

unsigned char counter = 0;  // 计数的

bit  tt1;      // 标志位

void main()    // 主函数

{

TMOD=0x20;

TH1=256-30;      // 定时时间  可以修改

TL1=256-30;     // 12 MHz

EA=1;                      // 中断启动

ET1=1;

TR1=1;

while(1)

{                       // 调节 PWM0  占空比

if(key10==0 && tt1==0) {tt1 = 1; PWM0++;} // K1、K2

if(key11==0 && tt1==0) {tt1 = 1; PWM0--;}

if(key10==1 && key11==1) tt1=0;

}

}

void Timer0(void) interrupt 3 // 定时器1   PWM 控制

{                         

counter++;

if(counter >= 20) counter = 0;   // PWM  32级  可以修改

if(counter >= PWM0) P1_0 = 0; else P1_0 = 1;

}

我有一个可以借鉴一下:

//

// 利用定时器控制产生占空比可变的 PWM 波

// 按K5,PWM值增加,则占空比减小,LED 灯渐暗。

// 按K6,PWM值减小,则占空比增加,LED 灯渐亮。

// 当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警。

//

#include < reg51h >

#include < intrinsh >

sbit K5 =P3^2 ; //增加键

sbit K6 =P3^3 ; //减少键

sbit BEEP =P3^7 ; //蜂鸣器

unsigned char PWM=0x7f ; //赋初值

void Beep();

void delayms(unsigned char ms);

//

void main()

{

P2=0xff;

TMOD=0x21 ;

TH0=0xfc ; //1ms延时常数 12M

TL0=0x18 ; //频率调节

// TH1=PWM ; //脉宽调节

// TL1=0 ;

EA=1;

ET0=1;

ET1=1;

TR0=1 ;

while(1)

{

do{

if(PWM!=0xff)

{PWM++ ;delayms(10);}

else Beep() ;

}

while(K5==0);

do{

if(PWM!=0x00)

{PWM-- ;delayms(10);}

else Beep() ;

}

while(K6==0);

}

}

//

// 定时器0中断服务程序

//

void timer0() interrupt 1

{

// TR1=0 ;

TH0=0xfc ;

TL0=0x66 ;

TR1=1 ;

P2=0x00 ; //启动输出

}

//

// 定时器1中断服务程序

//

void timer1() interrupt 3

{

TH1=PWM ; //用定时器的方式2,是数据重装TH-TL中,改变PWM的值即该变定时器的初值

TR1=0 ;

P2=0xff ; //结束输出

}

//

//蜂鸣器子程序

//

void Beep()

{

unsigned char i ;

for (i=0 ;i<100 ;i++)

{

delayms(2) ;

BEEP=!BEEP ; //Beep取反

}

BEEP=1 ; //关闭蜂鸣器

delayms(100);

}

//

// 延时子程序

//

void delayms(unsigned char ms)

{

unsigned char i ;

while(ms--)

{

for(i = 0 ; i < 120 ; i++) ;

}

}

//

你想让输出口是P1^7,我这用的是P2口为输出,将其变化一下即可,希望对你有用!!!!!!!

以上就是关于求DSP产生可变占空比PWM波程序全部的内容,包括:求DSP产生可变占空比PWM波程序、51单片机输出可调节占空比的方波,周期20ms,占空比5%-10%,串口调节,求大神给个c程序。、51单片机两个io口同时输出两个占空比不同的方波以下程序希望给点灵感。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9520285.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存