打印

求一个用PIC做的SPWM程序

[复制链接]
7666|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
action99|  楼主 | 2010-11-1 15:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
pic, SPWM, ni, TI, TE
我正用PIC16F716芯片来做SPWM,晶振16M, 输出20KHZ,的SPWM信号,产生一个50HZ的正弦波,如下程序有些问题,查表中的数据是如何计算出来的?而且输出一个68HZ的正弦波,高手请指教。。。
void main()
{    asm("NOP");   
      TRISC=0X00;                //设置I/O口方向
      TRISD=0X00;          //设置I/O口方向
      PORTC=0X00;
      PORTD=0X00;
   //=============LCD init======================
   //   lcd_init();                 
   //=============timer0 init===================
   T0CON=0x82; //8分频  ;0xCx is 8bit timer
   TMR0L=0x79;
   TMR0H=0XFE;
   
   GIE=0X1;                    //开放全局中断
      TMR0IE=1;                   //使能timer0 interrupt   
   //==============PWM init=====================         
      PR2=124;                    //设置PWM频率20K
      CCPR1L=0;                   //设置占空比高8位,init时为0
      CCP1CON=0x0F;               //CCP select PWM mode
      T2CON=0X05;                 //设置TIMER2预分频比并使能T2      
   //==============MAIN LOOP====================
      while(1)
      {  }
}
//===============中断函数=============================
void interrupt ISR(void)
  {     
    if((TMR0IF)&&(TMR0IE))
    {   
     
     TMR0L=0x79;
     TMR0H=0XFE;
     TMR0IF=0;//清除中断标志        
        update_duty();//用3.2K的定时频率按照正弦规律改变脉宽,改64次正好为50HZ的调制正弦波
  }
   }
//下面这部分摘自另一个文件,
unsigned char R_sin=0; //这个变量从0~31变化。
unsigned char R_rate=190;//幅度
void update_duty(void)
{   unsigned int i=0;

if(R_sin==0)
    RC0=!RC0;   //创造交越信号
   
i=((float)(sin_tab[R_sin]))*R_rate/100;

  R_sin++;
if(R_sin==32)
    R_sin=0;   
     
CCPR1L=i/4;                   //设置占空比高8位,init时为0
    CCP1CON=0x0F+(i&3)*16;
}
const unsigned char sin_tab[32]={
0,25,50,74,98,120,142,162,180,
197,212,225,235,244,250,254,
255,254,250,244,235,225,212,
197,180,162,142,120,98,74,50,25};
沙发
yewuyi| | 2010-11-1 15:50 | 只看该作者
见张明峰先生的《PIC单片机入门与实战》相关章节,里面有详细讲解如何实现。

使用特权

评论回复
板凳
action99|  楼主 | 2010-11-3 00:07 | 只看该作者
又碰到问题,在程序中用了浮点数运算就不能单步执行了,这是为什么,程序如下:
float P0;
float P1;
float Double;
float I_A;
float  U_V;
float P2;



I_A=Load_AD;

  I_A=I_A*0.0196;   
  I_A=I_A/2;   

  U_V=((float)(SUN_AD))*0.0196;
  
  P1=I_A*U_V;

  if(P1>P0)
    P2=P1-P0;
  else
    P2=P0-P1;
  
  if(P2>1)P0=P1;

使用特权

评论回复
地板
Mary_luo| | 2010-11-3 11:01 | 只看该作者
太技术了,不懂。需要样品找我啊!:):)

使用特权

评论回复
5
action99|  楼主 | 2010-11-3 17:27 | 只看该作者
我用的是ICD2,PIC16F716 芯片+仿真头调试的,,没办法用浮点数,,,

使用特权

评论回复
6
yewuyi| | 2010-11-10 12:02 | 只看该作者
用浮点后该步代码执行时间太长,所以不能单步。

你可以设置断点,然后执行全速运行到断点,到下一行代码时,再把断点改到本行,再次执行全速运行,用这个方式即类似单步运行。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

87

主题

189

帖子

2

粉丝