导航:首页 > 编程语言 > pwm占空比程序

pwm占空比程序

发布时间:2023-02-12 03:08:21

❶ 关于PWM占空比调节的变成问题,有源程序请教!

递增,应有极限,不能从0再开始循环。

while(1) {
if(Key1 == 0) //判断是否K1键按下
{
Num++;
Delay10ms(1);
if(Num >= 9)
Num = 9; //我只是改了这一句
PWM_DA_Percent_change( PWM_Data[Num] ); //改变PWM的值
while(Key1 == 0); //等待按键抬起
}
}

❷ 51单片机测量PWM波的占空比的C语言程序

用定时器复产生程序如制下:
unsigned
int
a=0
,b=10;
void
main()
{
tmod=0x01;
th0=(65536-50000)/256;
tl0=(65536-50000)%256;
ea=1;
et0=1;
tr0=1;
}
void
pwm()
interrupt
1
{
th0=(65536-50000)/256;
tl0=(65536-50000)%256
;
a++;
p1^1=0;
if(a=20)
{
a=0;
}
if(a=b)
{
p1^1=1;
}
}
调节a
,b的值即可调节占空比,程序框架就是这样,具体自己改吧

❸ 求单片机输出占空比可调的PWM波程序

80S52没有硬件PWM功能,靠
定时器中断很简单,只不过频率不能太高,或调
节精度比较差
下面是双定时器产生PWM主要语句:
TMOD=0X11;
TH0=(65536-20000)/256;//
定时20ms
TL0=(65536-20000)%256;
TH1=(65536-b)/256;//定时要小于20ms,改变b的值即改变占空比
TL1=(65536-b)%256;
ET0=1;
EA=1;
TR0=1;
PWM=1;
b=2000;
while(1);
void
timer0()interrupt
1
{
TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
PWM=1;
TR1=1;
ET1=1;
}
void
timer1()interrupt
3
{
TH1=(65536-b)/256;
TL1=(65536-b)%256;
PWM=0;
TR1=0;
ET1=0;
}
定时器0中断负责每
20ms将管脚置
1,定时1负责在20ms之内的某一时间将该管脚清0
当然也可以采用自动重装方式,中断可以更频繁一些,产生的PWM频率要高一些
也可以只用一个定时器,这时产生PWM波要么频率低,要么调节精度差,因中断一次至少10US,你就不用指望一次调节步距10us以下了

❹ 怎样用单片机STC 89C52实现pwm控制占空比的输出波形,求程序!能详细备注的最好!


PWMHDATA30H;高电平脉冲的个数

PWMDATA31H;PWM周期

COUNTERDATA32H

TEMPDATA33H

ORG0000H

AJMPMAIN

ORG000BH

AJMPINTT0

ORG0100H

MAIN:

MOVSP,#60H;给堆栈指针赋初值

MOVPWMH,#02H;

MOVCOUNTER,#01H

MOVPWM,#15H

MOVTMOD,#02H;定时器0在模式2下工作

MOVTL0,#38H;定时器每200us产生一次溢出

MOVTH0,#38H;自动重装的值

SETBET0;使能定时器0中断

SETBEA;使能总中断

SETBTR0;开始计时

KSCAN:

JNBP1.1,K1CHECK;扫描KEY1,

JNBP1.2,K2CHECK;扫描KEY2,如果按下KEY2,跳转到KEY2处理程序

SJMPKSCAN

K1CHECK:

JBP1.1,K1HANDLE;去抖动,如果按下KEY1,跳转到KEY1处理程序

SJMPK1CHECK

K1HANDLE:

MOVA,PWMH

CJNEA,PWM,K1H0;判断是否到达上边界

SJMPKSCAN;是,则不进行任何操作

K1H0:

MOVA,PWMH

INCA

CJNEA,PWM,K1H1;如果在加1后到达最大值

CLRTR0;定时器停止

SETBP1.0;P1.0为高电平

SJMPK1H2

K1H1:

CJNEA,#02H,K1H2;如果加1后到达下边界

SETBTR0;重开定时器

K1H2:

INCPWMH;增加占空比

SJMPKSCAN

K2CHECK:

JBP1.2,K2HANDLE;去抖动,如果按下KEY2,跳转到KEY2处理程序

SJMPK2CHECK

K2HANDLE:

MOVA,PWMH

CJNEA,#01H,K2H0;判断是否到达下边界

SJMPKSCAN;是,则不进行任何操作

K2H0:

MOVA,PWMH

MOVTEMP,PWM

DECA

CJNEA,#01H,K2H1;如果在减1后到达下边界

CLRTR0;定时器停止

CLRP1.0;P1.0为低电平

SJMPK2H2

K2H1:

DECTEMP

CJNEA,TEMP,K2H2;如果到达上边界

SETBTR0;启动定时器

K2H2:

DECPWMH;降低占空比

SJMPKSCAN

INTT0:

PUSHPSW;现场保护

PUSHACC

INCCOUNTER;计数值加1

MOVA,COUNTER

CJNEA,PWMH,INTT01;如果等于高电平脉冲数

CLRP1.0;P1.0变为低电平

INTT01:

CJNEA,PWM,INTT02;如果等于周期数

MOVCOUNTER,#01H;计数器复位

SETBP1.0;P1.0为高电平

INTT02:

POPACC;出栈

POPPSW

RETI

❺ 求MSP430单片机用两个按键控制PWM波占空比的程序!!!!谢谢啦!!!

//程序说明:使用内部内部时钟fosc/12产生周期为256us,占空比为25%的方波
#include<STC12C5616AD.h>
#define uchar unsigned char
#define uint unsigned int
sbit d1=P1^0;
sbit d2=P1^1;
void PWM_init()
{
CMOD=0x00;//PCA计数脉冲选择内部时钟fosc/02(0x02:fosc/2)
CL=0x00;//PCA赋初值
CH=0x00;

}
void PWM0(uchar ZKB)
{
CCAP0L=CCAP0H=ZKB;//255*(100-ZKB)/100;//占空比设置
// =;//255*(100-ZKB)/100;//CL由ff-00溢出时,CCAP0H的值装入CCAP0L
CCAPM0=0x42;// 8位PWM模式
CR=1; //开始计数
}
void PWM1(uchar ZKB) //高电平占得比例占空比为(Gao/255)
{

CCAP1H = CCAP1L = ZKB;//256-(int)(256/100)*Gao;
CCAPM1=0x42;// 8位PWM模式
CR=1;
}
void PWM2(uchar ZKB) //高电平占得比例占空比为(Gao/255)
{

CCAP2H = CCAP2L = ZKB;//256-(int)(256/100)*Gao;
CCAPM2=0x42;// 8位PWM模式
CR=1;
}
void PWM3(uchar ZKB) //高电平占得比例占空比为(Gao/255)
{

CCAP3H = CCAP3L = ZKB;//256-(int)(256/100)*Gao;
CCAPM3=0x42;// 8位PWM模式
CR=1;
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
PWM_init();
while(1)
{
if(d1!=0)
{
PWM0(130);
PWM1(130);
PWM2(255);
PWM3(255);
}
if(d2==1)
{
PWM0(60);
PWM1(255);
PWM2(20);
PWM3(255);
delay(300);
}
i

}
}
若不是新手加上按键应该会的

❻ 跪求stc12c5a60s2单片机PWM程序。50%占空比。P1.3口输出PWM。

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

/*********************************************************************************************
函数名:PWM初始化函数
调 用:PWM_init();
参 数:无
返回值:无
结 果:将PCA初始化为PWM模式,初始占空比为0
备 注:需要更多路PWM输出直接插入CCAPnH和CCAPnL即可
/**********************************************************************************************/
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

//CCAPM2=0x42; //PWM2设置PCA工作方式为PWM方式
//CCAP2L=0x00; //设置PWM2初始值与CCAP0H相同
//CCAP2H=0x00; // PWM2初始时为0

//CCAPM3=0x42; //PWM3设置PCA工作方式为PWM方式
//CCAP3L=0x00; //设置PWM3初始值与CCAP0H相同
//CCAP3H=0x00; // PWM3初始时为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 main (void){
while(1){
PWM_init(); //PWM初始化
PWM0_set(0x7F); //设置PWM占空比,总共255,除以2,转换成十六进制得7F
}
}
/**********************************************************************************************/

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

用EVA事件管理器产生 重点看哈那张的内容 占空比有公式计算 自己动手做了才知道是怎么回事
/****************************************************************************
*
*文件名:EvPwm02.c
*
*功 能:PWM1和PWM2输出频率为1KHz的PWM波形。波形的占空比每隔1s变化5%,范围在10%
* 到90%之间。
*
*说 明:EVA下面的通用定时器T1工作于连续增/减计数模式,产生对称的PWM波形。通过
* T1的周期中断来计时,每隔1s钟改变1次占空比。死区时间为4.27us。
*
****************************************************************************/

#include "DSP28_Device.h"
#include "DSP28_Globalprototypes.h"

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; //占空比逐渐变大的变化趋势标志位

PieCtrl.PIEIER2.bit.INTx4=1; //使能PIE中断,T1定时器中断位于INT2.4

IER|=M_INT2;

EINT; //开全局中断
ERTM; //开实时中断

EvaRegs.T1CON.bit.TENABLE=1; //使能定时器T1计数操作

while(1)
{

}

}

❽ 求51单片机用三个定时器同时产生3路占空比可调的pwm的程序

一个定时器就能搞定

#include<reg51.h>
#include<INTRINS.h>
#defineu16unsignedint
#defineu8unsignedcharsbitpwm1=P1^0;
sbitpwm2=P1^1;
sbitpwm3=P1^2;
u8jsflag;
u8pwm[3]={0,100,200};//三路pwm的值,范围为0-200

voidinit() //初始化函数
{TMOD|=0x01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
EA=1;
ET0=1;
TR0=1;

}

voidmain()//主函数
{
init();
while(1);
}voidtimer0()interrupt1//定时器,100us
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
if(++jsflag>=200)jsflag=0;
pwm1=(jsflag>=pwm[0]?0:1);
pwm2=(jsflag>=pwm[1]?0:1);
pwm3=(jsflag>=pwm[2]?0:1);
}
阅读全文

与pwm占空比程序相关的资料

热点内容
海川化工下载的文件默认到哪里 浏览:343
学唱粤语歌app 浏览:975
qq游戏生死狙击玩不了 浏览:120
win10邮件不显示图片 浏览:922
口袋妖怪所有版本下载 浏览:504
我们身边都有哪些大数据例子 浏览:25
震旦adc307扫描的文件在哪里 浏览:999
图片打开变成文件 浏览:194
松下微单电脑传文件软件 浏览:574
苹果蓝牙键盘surface 浏览:170
mindmaplinux 浏览:733
oppo手机怎么连接电脑传输数据 浏览:624
word删除尾注分隔符 浏览:773
公告质疑需要哪些文件 浏览:608
数据库模型是干什么的 浏览:404
win10的驱动怎么安装驱动 浏览:320
word文件水印怎么取消 浏览:443
rhel6的镜像文件在哪里下载 浏览:571
成功正能量微信头像 浏览:848
wps表格如何恢复数据 浏览:264

友情链接