用单片机输出 spwm 波形

用单片机输出 spwm 波形,第1张

stc12c5608ad单片机有硬件PWM功能,只要在主程序里按正弦规律改变输出脉冲的占空比即可,可将正弦波分成50个时间段,每个时间段是20ms/500=400us,用定时器定时400us改变一次CCAP1L的值(该值除以256即是占空比)即可,CCAP1L的值可以在程序中用三角函数计算,也可以事先计算好存入数组中.

//

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

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

CL=0x00;

CH=0x00;

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

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

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

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

}

//void PWM1_set (uchar a)//PWM1占空比设置函数

{

CCAP1L=a; //设置值直接写入CCAP1L

CCAP1H=a; //设置值直接写入CCAP1H

}

1、PWM波是控制直流电机的

通俗的说,5V直流电机在5V的情况下肯定速度最快,在0V的情况下肯定不转了

这样电源0~5V就对应了不同的速度

问题是怎么才能实现0~5V的变化呢?

于是就用PWM波控制mos管来给直流电机供电。PWM就是一个矩形波,通过控制高电平和低电平的时间来控制MOS管导通的时间。MOS管在高电平的时候导通,就相当于5V电源直接加到电机上;MOS管在低电平的时候截止,就相当于0V电源加到电机上。

PWM又叫脉宽调制,就是控制高电平占一个周期的比例。而这个PWM波就是控制5V电源加到电机上的时间,从而控制了电机。

2、例程:

#include <reg52h>

sbit KEY1 = P3^4;

sbit PWM = P1^5;

unsigned char CYCLE; //定义周期 该数字X基准定时时间 如果是10 则周期是10 x 01ms

unsigned char PWM_ON ;//定义高电平时间

void delay(unsigned int cnt)

{

while(--cnt);

}

main()

{

unsigned char PWM_Num;//定义档位

TMOD |=0x01;//定时器设置 1ms in 12M crystal

TH0=(65536-1000)/256;

TL0=(65536-1000)%256;//定时1mS

IE= 0x82; //打开中断

TR0=1;

CYCLE = 10;// 时间可以调整 这个是10步调整 周期10ms 8位PWM就是256步

while(1)

{

if(!KEY1)

{

delay(10000);

if(!KEY1)

{

PWM_Num++;

if(PWM_Num==4)PWM_Num=0;

switch(PWM_Num){

case 0:P0=0x06;PWM_ON=0;break;//高电平时长

case 1:P0=0x5B;PWM_ON=4;break;

case 2:P0=0x4F;PWM_ON=6;break;

case 3:P0=0x66;PWM_ON=8;break;

default:break;

}

}

}

}

}

//

/ 定时中断 /

//

void tim(void) interrupt 1 using 1

{

static unsigned char count; //

TH0=(65536-1000)/256;

TL0=(65536-1000)%256;//定时1mS

if (count==PWM_ON)

{

PWM = 1; //灯灭

}

count++;

if(count == CYCLE)

{

count=0;

if(PWM_ON!=0) //如果左右时间是0 保持原来状态

PWM = 0;//灯亮

}

要连续可调的频率……这就是最大的难度了,比如20KHz,19999KHz,19998KHz如果这样的连续,除了DDS之外,估计想用单片机的定时器模拟SPWM基本不可能。

就算是用方波进行低通滤波得到正弦波,但是连续频率的方波产生难度也是很大的,需要使用PLL……嗯,估计只有这个办法了。

工作原理你可以看一下STC单片机的PCA相关章节,占空比由CCAP0L,CCAP0H,

CCAP1L,CCAP1H的值确定;比如其值为255,那么占空比就为0%,其值为128,占空比就为50%,其值为0,占空比就为100%。

找不到h的错误一般就是路径设置不对,要么就在源码中将h的路径加入到#include中,要么就在工程里将路径设置正确。先把h弄对,再解决其它问题,因为有很多错误是因为找不到h文件产生的。

以上就是关于用单片机输出 spwm 波形全部的内容,包括:用单片机输出 spwm 波形、CCS软件C语言编程输出SPWM脉宽调制波控制感应电机转速程序算法解读、大神求助,怎么用51单片机产生正弦信号,要求是20kHz以下的连续可调的频率。且不能用集成度高的专用芯片等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存