找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

关于频率可调节的pwm,各位大师 不知道我描述的你们能看懂不

查看数: 2886 | 评论数: 8 | 收藏 2
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2021-9-2 11:25

正文摘要:

第二  这个波形是需要经过调制后需要 单片机最后输出的波形    请问这个波形该怎么输出     中间密集的那分怎么变换   占空比都是一样的    ...

回复

ID:254747 发表于 2021-9-2 23:55
非常感谢大家的回复   我按照你们的思路在搞一下
ID:163285 发表于 2021-9-2 15:55
参考单片机电子琴发声原理。高音叨是中音叨两倍频。
ID:161164 发表于 2021-9-2 15:04
由图看出高频是低频的一倍
PCA不懂,如果频率不高可以用定时器软件模拟
  1. void timer1_int (void) interrupt 3
  2. {
  3.         static uchar i = 0;
  4.         TL1 = 0x18;                //设置定时初始值1ms@12.000MHz 12T
  5.         TH1 = 0xFC;                //设置定时初始值1ms@12.000MHz 12T
  6.         if(HLF_Sel)//0 = Low Feq, 1 = High Feq
  7.         {
  8.                 S_Out = i%2;//0=0,1=1,2=0,3=1
  9.         }
  10.         else
  11.         {
  12.                 S_Out = i>1;//0=0,1=0,2=1,3=1
  13.         }
  14.         if(++i==4)
  15.         {
  16.                 i=0;
  17.         }
  18. }
复制代码
ID:624769 发表于 2021-9-2 14:49
思路是:定时器确定切换波频率的周期,改写PWM定时器,PWM只管输出就完了。
其实频占比都是50%的话,压根不用PWM,直接用T0CLK_OUT就可以了。
ID:332444 发表于 2021-9-2 14:37
看图疑似倍频有2种方法1改变定时器初值2不变定时器初值修改计数值
ID:213173 发表于 2021-9-2 14:29
本帖最后由 wulin 于 2021-9-7 08:36 编辑

最简单的方法是用定时器,按需要的脉冲宽度和变化周期做一个数组,定时器中断函数按序从数组中取值作重载值即可。示例如下:是一个按正弦规律变化的PWM波形。
  1. #include <reg51.h>
  2. sbit PWM=P1^0;
  3. unsigned char code K_Sine[256]={
  4. 0x00,0x01,0x03,0x04,0x06,0x07,0x09,0x0a,0x0c,0x0d,0x0f,0x10,
  5. 0x12,0x13,0x15,0x16,0x18,0x19,0x1b,0x1c,0x1e,0x1f,0x21,0x22,
  6. 0x24,0x25,0x27,0x28,0x2a,0x2b,0x2d,0x2e,0x2f,0x31,0x32,0x34,
  7. 0x35,0x36,0x38,0x39,0x3b,0x3c,0x3d,0x3f,0x40,0x41,0x43,0x44,
  8. 0x45,0x47,0x48,0x49,0x4a,0x4c,0x4d,0x4e,0x4f,0x50,0x52,0x53,
  9. 0x54,0x55,0x56,0x57,0x58,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,
  10. 0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x67,0x68,0x69,0x6a,0x6b,
  11. 0x6c,0x6d,0x6d,0x6e,0x6f,0x70,0x70,0x71,0x72,0x72,0x73,0x74,
  12. 0x74,0x75,0x76,0x76,0x77,0x77,0x78,0x78,0x79,0x79,0x7a,0x7a,
  13. 0x7b,0x7b,0x7b,0x7c,0x7c,0x7d,0x7d,0x7d,0x7d,0x7e,0x7e,0x7e,
  14. 0x7e,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7d,0x7b,0x7a,
  15. 0x78,0x77,0x75,0x74,0x72,0x71,0x6f,0x6e,0x6c,0x6b,0x69,0x68,
  16. 0x66,0x65,0x63,0x62,0x60,0x5f,0x5d,0x5c,0x5a,0x59,0x57,0x56,
  17. 0x54,0x53,0x51,0x50,0x4f,0x4d,0x4c,0x4a,0x49,0x48,0x46,0x45,
  18. 0x43,0x42,0x41,0x3f,0x3e,0x3d,0x3b,0x3a,0x39,0x37,0x36,0x35,
  19. 0x34,0x32,0x31,0x30,0x2f,0x2e,0x2c,0x2b,0x2a,0x29,0x28,0x27,
  20. 0x26,0x24,0x23,0x22,0x21,0x20,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,
  21. 0x19,0x18,0x17,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x11,0x10,
  22. 0x0f,0x0e,0x0d,0x0c,0x0c,0x0b,0x0a,0x0a,0x09,0x09,0x08,0x08,
  23. 0x07,0x07,0x05,0x05,0x04,0x04,0x04,0x03,0x03,0x03,0x02,0x02,
  24. 0x02,0x02,0x02,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,
  25. 0x00,0x00,0x00,0x00};    //kindred sine wave

  26. void InitTimer0(void)
  27. {
  28.     TMOD = 0x01;
  29.     TH0 = 0xff;
  30.     TL0 = 0x00;
  31.     EA = 1;
  32.     ET0 = 1;
  33.     TR0 = 1;
  34. }

  35. void main(void)
  36. {
  37.         InitTimer0();
  38.         while(1);
  39. }

  40. void Timer0Interrupt(void) interrupt 1
  41. {
  42.         static unsigned char i;
  43.         PWM=~PWM;
  44.         TH0 = 0xff;
  45.         TL0 = K_Sine[i];
  46.         i++;
  47. }
复制代码
ID:514901 发表于 2021-9-2 13:56
是不是只有两种频率?我看占空比都是50%,没必要用PWM了,搞个定时器就行
ID:94031 发表于 2021-9-2 13:52
用不同定时中断输出高低电平实现。

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

Powered by 单片机教程网

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