找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主

第一图是一个正常输出的波形   




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


我是这样弄的 但是不行    我设置了一个参考波形 参考波形的占空比就是图中的密集部分      这个参考波形我是通过PCA产生的波形 然后通过外部触发中断INT0来实现 下降沿触发  上升下降都无法   但是最后得不到这个波形   而且进入中断以后  main函数中的程序就不能正常运行了  无法退出中断      

请问还有什么方法可以实现  这样的波形    这个波形的  频率是可以调节的   可以在不同时刻调节不一样的频率  但是最后我要得到这个波形  
现在调节频率这些我都弄好了   就差最后这一步了     有没有高手给我说一下      

可以用ADC合成吗   通过一个控制PWM来实现  
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:94031 发表于 2021-9-2 13:52 | 只看该作者
用不同定时中断输出高低电平实现。
回复

使用道具 举报

板凳
ID:514901 发表于 2021-9-2 13:56 | 只看该作者
是不是只有两种频率?我看占空比都是50%,没必要用PWM了,搞个定时器就行
回复

使用道具 举报

地板
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. }
复制代码
回复

使用道具 举报

5#
ID:332444 发表于 2021-9-2 14:37 | 只看该作者
看图疑似倍频有2种方法1改变定时器初值2不变定时器初值修改计数值
回复

使用道具 举报

6#
ID:624769 发表于 2021-9-2 14:49 | 只看该作者
思路是:定时器确定切换波频率的周期,改写PWM定时器,PWM只管输出就完了。
其实频占比都是50%的话,压根不用PWM,直接用T0CLK_OUT就可以了。
回复

使用道具 举报

7#
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. }
复制代码
回复

使用道具 举报

8#
ID:163285 发表于 2021-9-2 15:55 | 只看该作者
参考单片机电子琴发声原理。高音叨是中音叨两倍频。
回复

使用道具 举报

9#
ID:254747 发表于 2021-9-2 23:55 | 只看该作者
非常感谢大家的回复   我按照你们的思路在搞一下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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