搜索
bottom↓
回复: 10

用PIC单片机的PWM生产一个频率和幅值可调的正弦波

[复制链接]

出0入0汤圆

发表于 2021-1-15 08:17:22 | 显示全部楼层 |阅读模式
  1. #include "Head.h"
  2. void main (void)
  3. {
  4.      OSCCON=0b11110000;  
  5.      TRISD=0;      
  6.      PORTD=0;   
  7.      TRISC=0b10000000;
  8.      OPTION_REG=0b10001000;
  9.      INTCON=0b11100000;   
  10.      PIE1=0b00100000;//开串口中断
  11.      CCP1CON=0b00001100;
  12.      PR2=255;
  13.      T2CON=0b00000100;//  最大脉冲宽度 4*(255+1)=1024
  14.      TXSTA=0b00100100;     //SYNC=0;BRGH=1;
  15.      RCSTA=0b10010000;
  16.      BAUDCON=0b00001000;   //BRG16=1;
  17.      SPBRGH=0;
  18.      SPBRG=207;            //FOSC/[4(n+1)] (32000000/38400)/4-1=207  

  19.      while(1)
  20.      {
  21.       Send();
  22.      }   
  23. }

  24. //定时器中断程序
  25. void interrupt TMR0INT(void)//4/32*256=32us
  26. {
  27.     static unsigned char a=0,b=0,c=0;
  28.     static unsigned int pwm_duty=0;
  29.     const unsigned int pwm_1[PI_data]={0,13,25,37,50,62,74,85,96,107,118,127,137,146,154,162,
  30.     169,175,181,186,190,194,196,198,200,200,200,198,196,194,190,186,
  31.     181,175,169,162,154,146,137,127,118,107,96,85,74,62,50,37,
  32.     25,13};
  33.     const unsigned int pwm_2[PI_data]={0,31,63,94,124,155,184,213,241,268,294,319,342,364,385,405,
  34.     422,438,452,465,476,484,491,496,499,500,499,496,491,484,476,465,
  35.     452,438,422,405,385,364,342,319,294,268,241,213,184,155,124,94,
  36.     63,31};
  37.     const unsigned int pwm_3[PI_data]={0,63,125,187,249,309,368,426,482,536,588,637,685,729,771,809,
  38.     844,876,905,930,951,969,982,992,998,1000,998,992,982,969,951,930,
  39.     905,876,844,809,771,729,685,637,588,536,482,426,368,309,249,187,
  40.     125,63};
  41.    
  42.     if(T0IF)
  43.     {
  44.         T0IF=0;
  45.         LATD6^=1;
  46.         if(++a==Pwm_frequency)  //1000000/(Pwm_frequency*32*50)=频率HZ  1000000/(6*32*50)=104HZ
  47.         {
  48.           a=0;
  49.           if(++b==PI_data)b=0;
  50.           switch(c)
  51.           {
  52.              case 1:  {pwm_duty=pwm_1[b];break;}
  53.              case 2:  {pwm_duty=pwm_2[b];break;}
  54.              case 3:  {pwm_duty=pwm_3[b];break;}
  55.              default: {pwm_duty=pwm_1[b];break;}  
  56.           }  CCP1CON=(CCP1CON&0xcf)|((pwm_duty&3)<<4);CCPR1L=pwm_duty>>2;
  57.        }
  58.     }
  59.    
  60.    if(RCIF)   
  61.    {  
  62.       static unsigned char temp=0;  
  63.       if(OERR==1){CREN=0;asm("nop");CREN=1;}
  64.       temp=RCREG;
  65.       switch(temp)
  66.       {
  67.         case 'a':{Pwm_frequency++;break;}//频率加
  68.         case 'b':{if(Pwm_frequency)Pwm_frequency--;break;}//频率减
  69.         case 'c':{c++;if(c>3)c=1;break;}//振动幅度
  70.       }
  71.     }
  72. }

复制代码




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2021-2-14 21:23:57 | 显示全部楼层
这波形下半部分怎么是尖的?上半部分是圆滑的

出0入0汤圆

发表于 2021-2-15 12:17:20 | 显示全部楼层
wiisir 发表于 2021-2-14 21:23
这波形下半部分怎么是尖的?上半部分是圆滑的

只有半波

出0入0汤圆

发表于 2021-2-15 20:58:50 | 显示全部楼层

知道了,谢谢.

出0入0汤圆

发表于 2021-2-17 13:31:43 | 显示全部楼层
学习,原理图可以贴出来吗?

出0入0汤圆

发表于 2021-2-17 13:32:37 | 显示全部楼层
原理图可以贴出来看看吗?

出0入4汤圆

发表于 2021-2-17 20:09:23 | 显示全部楼层
PIC  输出 正玄波  什么原理?

出0入4汤圆

发表于 2021-2-18 08:15:39 来自手机 | 显示全部楼层
频率最高能做到多少?

出0入0汤圆

发表于 2021-3-18 15:58:39 | 显示全部楼层
看着还不错

出0入0汤圆

发表于 2021-7-6 17:41:38 来自手机 | 显示全部楼层
Mark一下

出0入0汤圆

发表于 2021-7-7 12:29:25 | 显示全部楼层
如果想再细致些,可以2个端口输出,间隔输出,一个端口用运放反向,再合并,就是完整正弦波了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 18:42

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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