找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2677|回复: 15
打印 上一主题 下一主题
收起左侧

单片机pwm程序如何把频率改变为30khz左右?

[复制链接]
跳转到指定楼层
楼主
ID:753525 发表于 2021-5-1 17:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
先说声谢谢,我是新手现碰到问题是占空比可以调节,频率太低只有400hz,能否把频率提升到30khz左右,

单片机程序如下:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sfr T2MOD=0xc9;
sbit pwm=P1^0;
sbit k1=P3^2;
sbit k2=P3^3;
uchar scale=50;
void timer2() interrupt 5
{
static uchar tt;
TF2=0;
tt++;
if(tt==100)
{
  tt=0;
  pwm=0;
  }
  if(tt==scale)
  pwm=1;
}

void main()
{
uint n;
RCAP2H=0xff;
RCAP2L=0xfa;
T2CON=0;
T2MOD=0;
TR2=1;
ET2=1;
EA=1;
while(1)
{
  if(k1==0)
  {
   for(n=0;n<5000;n++);
   if(k1==0)
   scale++;
   if(scale==51)
   {
    pwm=0;
        scale=50;
   }                                                         
  }
  if(k2==0)
  {
   for(n=0;n<5000;n++);
   if(k2==0)
   scale--;
   if(scale==20)
   {
    pwm=1;
        scale=21;
        }

   }
  }
}           

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:900082 发表于 2021-5-2 11:55 来自手机 | 只看该作者
for(n=0;n<5000;n++);这句用来延时的,试试更改5000这个值。我也是小白,期待大佬指点和楼主共师兄习。
回复

使用道具 举报

板凳
ID:319585 发表于 2021-5-2 13:12 来自手机 | 只看该作者
楼主首先你的单片机主频多少?然后你要求的pwm分辨率多少?频率高了分辨率就会降低。另外部分电机如果pwm频率高了,会导致电流过大,功耗增加。
回复

使用道具 举报

地板
ID:889094 发表于 2021-5-2 23:28 | 只看该作者
中断函数中不要数到100了,可以数到10,就快了10倍了,当然,你的SCALE也要变变
回复

使用道具 举报

5#
ID:753525 发表于 2021-5-3 10:22 | 只看该作者
birdzhyli 发表于 2021-5-2 23:28
中断函数中不要数到100了,可以数到10,就快了10倍了,当然,你的SCALE也要变变

你好,你方法思路是正确的,能达到4khz,可是还是达不到我要求频率,我没办法了,你有这方面程序吗,教教我。
回复

使用道具 举报

6#
ID:465763 发表于 2021-5-4 15:24 | 只看该作者
你这个是模拟的PWM,频率做不高的,要用专门带PWM输出的单 片机
回复

使用道具 举报

7#
ID:753525 发表于 2021-5-5 09:50 | 只看该作者
lujinlun 发表于 2021-5-4 15:24
你这个是模拟的PWM,频率做不高的,要用专门带PWM输出的单 片机

谢谢指点
回复

使用道具 举报

8#
ID:889094 发表于 2021-5-6 18:09 来自手机 | 只看该作者
本帖最后由 birdzhyli 于 2021-5-6 19:36 编辑

你的晶振和单片机是1t还是12t,1khz是1ms1次,10khz是100us一次,30khz是要33us一次,如果是12t11。0592m晶振就一个指令好像大约是1us,所以你要确定自己单片机够使,然后指令能够在相应的时间里执行完毕。如果30Khz,也就是最多执行33指令,否则上一个中断没有处理完下一次中断时间又到了,程序估计会乱,我没遇到过,不知道会是什么情况。而33个指令按我的感觉应该是几行就占完了,就算没有占完,频繁中断,主程序估计也就干不成啥了,当然如果本身就是为了输出PWM的话,主程序也就不重要了
回复

使用道具 举报

9#
ID:889094 发表于 2021-5-6 18:09 来自手机 | 只看该作者
如果是自带pwm的单片机只要看手册例程就可以了
回复

使用道具 举报

10#
ID:160500 发表于 2021-5-6 18:56 | 只看该作者
51做这个软件PWM有点难,可以使用带PWM模式的定时器。
回复

使用道具 举报

11#
ID:889094 发表于 2021-5-6 19:20 | 只看该作者
你的mcu的interrupt5是timer2,估计要比较好的,我的89C52和12C5A都没有timer2,我的12C5A的中断5是ADC模数转换中断,想要弄明白是怎么回事,你的程序看着应该是管用的,你需要把芯片和手册弄明白,把程序自己捋顺了,看明白了自然就会了
回复

使用道具 举报

12#
ID:753525 发表于 2021-5-7 08:54 | 只看该作者
birdzhyli 发表于 2021-5-6 19:20
你的mcu的interrupt5是timer2,估计要比较好的,我的89C52和12C5A都没有timer2,我的12C5A的中断5是ADC模数 ...

谢谢,我再努力,是在不行就用2个定时器。
回复

使用道具 举报

13#
ID:57657 发表于 2021-5-7 10:29 | 只看该作者
30Khz的软件PWM,晶振没有百十来Mhz就不要想了。
回复

使用道具 举报

14#
ID:753525 发表于 2021-5-14 08:51 | 只看该作者
谢谢各位大师的指点,关于单片机pwm程序如何把频率改变为30khz左右?的问题已解决
回复

使用道具 举报

15#
ID:879348 发表于 2021-5-14 08:58 | 只看该作者
必须要集成pwm外设的单片机,而且STC51的pwm也是不能设置任意准确频率
回复

使用道具 举报

16#
ID:280000 发表于 2021-5-25 20:17 | 只看该作者
需要修改定时器的频率和自动重装载值
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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