C8051的C语言编程产生占空比可调的PWM波

C8051的C语言编程产生占空比可调的PWM波,第1张

viod function(PORT,PWM)

{

int i=0;

while(1)

{

i++;

if(i<PWM)

{PORT=1;

}

if(PWM<i<100)

{PORT=0;

}

if(i=100)

{i=0;

}

}

子程序,初始化什么的,自己参照教程加进去,在main()函数里调用这个子程序,通过改变PWM,和100的值可以改变PWM频率

“用单片机怎样产生频率可调的200khzpwm波”这句话有语病,要么是占空比可调的200khzpwm波,要么是频率可调的pwm波,既然频率可调,200khz什么意思?

占空比可调的200khzpwm波,可以实现,前提是系统时钟频率足够高。方法是使用定时器中断,计算出200khz周期对应的定时器中断装载值,采取两次中断法,两次中断定时器的装载值之和等于200khz频率周期,加这个减那个,就实现占空比可调,这种方式占空比可调范围大。

频率可调的pwm波,也可实现,固定一个相位的定时周期,调整另一相位的周期,即可达到调整占空比和频率的目的,这种方法占空比的调整有一定限度。

void TIM2_PWM_OUT_Conf(void)

{

RCC->APB1ENR |=1<<0; //TIM2 Clock

RCC->APB2ENR |=1<<2; //GPA Clock

RCC->APB2ENR |=1<<0; //AFIO Clock

RCC->APB2ENR |=1<<3; //GPB Clock

RCC->APB1ENR |=7<<0; //TIM2 TIM3 TIM4 Clock

GPIOA->CRL &=0xFFFF0000; //

GPIOA->CRL |=0x0000BBBB; //AF-Out

TIM2->CR1 |=1<<4; //Count Down

TIM2->CCMR1 |=6<<4; //OC1M:PWM1

TIM2->CCMR1 |=6<<12; //OC2M:PWM1

TIM2->CCMR2 |=6<<4; //OC3M:PWM1

TIM2->CCMR2 |=6<<12; //OC4M:PWM1

// TIM2->CCMR1 |=1<<2;

// TIM2->CCMR2 |=1<<10;

// TIM2->CCMR1 |=1<<2;

// TIM2->CCMR2 |=1<<10;

TIM2->CCER |=1<<0; //CC1E ENABLE

TIM2->CCER |=1<<4; //CC2E ENABLE

TIM2->CCER |=1<<8; //CC3E ENABLE

TIM2->CCER |=1<<12; //CC4E ENABLE

TIM2->PSC =719; //720-1 PSC

TIM2->ARR =PWM_PERIOD; //20ms

TIM2->CR1 |=1<<0; //ENABLE

}

//CCR 寄存器修改占空比

频率的选择主要看你的中断间隔了,假设你的程序每50us进入一次中断,那么就是说每50us进行一次PWM调制。这样你的PWM频率就是20KHz。如果你的程序写的很多,那么你就可以设定更长的中断周期,而相应的PWM调制频率就会降低。一般的PWM调节频率保持在10K-50K都是可以接受的。不知我的回答是否让您满意呢。

void PWM_init (void){//PWM初始化函数

CMOD=0x02; //设置PCA定时器,计数频率为晶振频率/2 当为12Mhz时,PWM输出频率约234Khz

//CMOD=0x00; //设置PCA定时器,计数频率为晶振频率/12 当为12Mhz时,PWM输出频率约39Khz

//CMOD=0x04; //设置PCA定时器,计数频率为定时器0的溢出率,如果让定时器0设为16位计数模式,其溢出频率可以在很大范围内调节,从而以产生很高或很低的PWM频率

CL=0x00;

CH=0x00;

CCAPM1=0x42; //PWM1设置PCA工作方式为PWM方式(0100 0010)

CCAP1L=0x00; //设置PWM1初始值与CCAP0H相同

CCAP1H=0x00; // PWM1初始时为0

CR=1; //启动PCA定时器

}

实际上要产生低频率的PWM波,不用其硬件PWM功能完全可以

用定时器中断方式即可实现

让定时器 200us中断一次(中断不算频繁呀) ,设一变量a,每次中断a加1,100次就是20ms,,另设一变量b,数值在1-100之间,每次中断比较a和 b的大小,如果a<b,则引脚 输出高电平,否则为低电平,这样通过改变b的值,就可实现频率为50HZ,占空比1-100%可调的PWM方波

你那个地方不明白?能具体说说吗?我看程序已经有不少注释了啊?

下面的比较多,复杂些,先简单的说下吧:

一、加速减速,就是增加或减少脉冲宽度,改变电机速度!脉冲的宽度由

1、CLK=0的状态持续,由T1的定时决定;

2、CLK=1的状态持续,由(T0-T1)的时间决定;

二、定时器中断TH0=0x00 ;   TL0=0x00 ;

1、T0定时器工作1方式,T0定时器启动后,从TH0、TL0赋值的计数值开始增加,增加到0XFFFF后,T0中断!

2、T0溢出后(中断),T0计数器不会自动停止,所以需要重新给T0定时器赋值!赋值后,进入下一个计数周期!

3、例子中,T0定时器从0x0000开始计数,也就是增加0xFFFF后进行中断!定时时间为 (0xFFFF / ( 晶振周期/12 ))) 秒,若晶振为12M,则定时为,65536ms!

分析程序,从main开始分析,先将起始开始的时序图画出:

如下图!

从时序图可以看出,CLK为PWM输出,

1、CLK=0的状态持续,由T1的定时决定;

2、CLK=1的状态持续,由T0-T1的时间决定;

而   main   函数中的  while(1)   部分,进行的就是PWM调整程序。

1、  if (K3==0)   //高电平逆时钟转,低电平顺时钟转

{

ZF=0;

}

else

{

ZF=1;

}

根据程序推测,程序若为电机控制,K3开关为0时,ZF=0,顺时针转,K3开关为1时,ZF=1,逆时针转。

2、

if(K1==0)   //按下加速键

{

delay(1);

PWML++;   //调宽值低四位加1

if(PWML==0x00)

{

PWMH++;

}   //调宽值高四位加1

if (PWMH==0xFF) //最大值时

{

PWMH=0xFE;

}

}

K1按键,加速按键,增加T1定时器计数起始时间,也就是减少T1计数时间,减少CLK=0的时间。

3、

if(K2==0) //按下减速键

{

delay(1);

PWML-- ;   //调宽值低四位减1

if (PWML==0x00)

{

PWMH--;

}    //调宽值高四位减1

if (PWMH==0x00)

{

PWMH=0x01;

}   //最小值时

}

K2按键,减速按键,降低T1定时器计数起始时间,也就是增加T1计数时间,增加CLK=0的时间。

4、不论加速、减速,T0的时间都不变,CLK=0和CLK=1总持续时间不变{ (Tclk0+Tclk1)=T0 }。

程序不难,图不好画啊!

#include<reg51h>

sbit P_OUT = P3^7;

sbit UP = P1^0;

sbit DN = P1^1;

unsigned char p = 5, n;

void T0_INT() interrupt 1

{

    n++;

    if(n > 9)  n = 0;  //0~9

    if(n <= p) P_OUT = 1;

    else       P_OUT = 0;

}

main()

{

    TMOD = 0x02;

    TH0 = 156;

    TR0 = 1;

    IE = 0x82;

    

    while(1) {

      if(P < 9 && !UP) {while(!UP); p++;}

      if(p > 0 && !DN) {while(!DN); p--;}

    }

}

你编译一下,汇编程序,就出来了。

以上就是关于C8051的C语言编程产生占空比可调的PWM波全部的内容,包括:C8051的C语言编程产生占空比可调的PWM波、用单片机怎样产生频率可调的200khzpwm波、如何运用STM32 的一个通用定时器产生频率可调的PWM等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9652416.html

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

发表评论

登录后才能评论

评论列表(0条)

保存