• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

stm8s 单片机调制SPWM

今天用STM8s试了下调制SPWM,查表法做的,定时器1通道2引脚输出SPWM,又通过一个LC滤波,就看到了下面的正弦波

 

#include "IOSTM8S103K3.h"
#include "math.h"
#include 
#define LED PC_ODR_ODR2

unsigned int pwm_duty[100];



unsigned char j=0; /* Phase difference */

unsigned char cnt_pwm=0;

void math(void)
{  
   unsigned char i;
   for(i=0; i<100; i++)
    {

       pwm_duty[i]=(unsigned int)(127+(float)127*sin(2*3.1415926*(float)i*0.2/(float)20));
   
    } 
}
void delay_us(unsigned int us)
{
       unsigned char j;
       while(us!=0)
       {
              for(j=0;j<250;j++)
              {}
              us--;
       }
} 

void Init_Timer4(void)
{  
    asm("sim"); 
    TIM4_CR1=0x01;//使能计数器
    TIM4_IER=0x01;//更新中断使能
    TIM4_EGR=0x01;
    TIM4_CNTR=199;//计数器值
    TIM4_ARR=199;//自动重装的值
    TIM4_PSCR=0x02;//分频值128
    asm("rim");//开全局中断,延时16.32ms
}
#pragma vector=TIM4_OVR_UIF_vector//0x19
__interrupt void TIM4_OVR_UIF_IRQHandler(void)//对应IAP的中断地址:0x8060
{
   TIM4_SR=0x00;
   cnt_pwm++;


   
  
    if (cnt_pwm>3)
    {
      cnt_pwm=0;  
      /* Sin wave CC1 PB0*/
   

      if(j>= 100) j=0;
      TIM1_CCR2H = (unsigned char)(pwm_duty[j]>>8);
      TIM1_CCR2L = (unsigned char)(pwm_duty[j]&0x00ff);
      j++;


    }


}
void TIM1_CH2_PWM_INIT(void)
 {
  CLK_PCKENR1|=0x80;//开启定时器1外设时钟 
  TIM1_EGR=0x01;//重新初始化TIM1
  TIM1_EGR|=0x60;//重新初始化TIM1
  TIM1_ARRH=0x00;//设定重装载值
  TIM1_ARRL=255;
  TIM1_PSCRH=0;//预分频
  TIM1_PSCRL=1;
  TIM1_CR1=0;//边沿对齐,向上计数
  
  TIM1_CCER1=0x11;//高电平有效
  
  TIM1_CCMR1=0x60;//PWM模式1
   TIM1_CCMR2=0x60;//PWM模式1
  
  TIM1_CCR2H=0;//占空比
  
  TIM1_CCR2L=254;
    
  TIM1_CCR1H=0;//占空比
  
  TIM1_CCR1L=254;
  
  TIM1_CR1|=0x01;//向上计数,无缓存,使能
  TIM1_BKR=0x80;//开启刹车
 }
void main( void )
{


    /*High speed internal clock prescaler: 1*/
          CLK_CKDIVR = 0x00;
          math();
          PC_DDR|=0x04;
	  PC_CR1|=0x04;
	  PC_CR2|=0x00;
          Init_Timer4();
          TIM1_CH2_PWM_INIT();





 


    while(1)
  {   
}


}
全部回复(17)
正序查看
倒序查看
net20
LV.4
2
2015-01-22 10:30
这是《例说STM8S单片机》里的样例程序吧
0
回复
2015-01-22 13:27
@net20
这是《例说STM8S单片机》里的样例程序吧

一个一个敲出来的啊

RC滤波后引脚波形

 

 

0
回复
net20
LV.4
4
2015-01-24 10:30
@想飞的狼
一个一个敲出来的啊RC滤波后引脚波形 [图片] 
不错啊,参考一下
0
回复
2015-02-09 21:56
@想飞的狼
一个一个敲出来的啊RC滤波后引脚波形 [图片] 
照这个公式STM32都算不过来,STM8算出来得有多慢。
0
回复
2015-02-10 09:28
@westkinger
照这个公式STM32都算不过来,STM8算出来得有多慢。
系统初始化的时候算一次,以后不算
0
回复
2015-02-13 19:10
@想飞的狼
系统初始化的时候算一次,以后不算
好想法,不错。
0
回复
小螃蟹
LV.1
8
2015-02-15 09:54
你这个不用换向吗,你的电路原理图是怎么样的,正弦波不是有上下两部分
0
回复
2015-02-23 12:24
在程序里面调用sin函数不是太好,这样比较耗资源,一般都采用查表来实现的吧
0
回复
2015-03-03 13:48
@皇甫仁和
在程序里面调用sin函数不是太好,这样比较耗资源,一般都采用查表来实现的吧
系统初始化的时候算一次,以后不算,也可以查表,一样的
0
回复
2015-03-27 19:24
@想飞的狼
系统初始化的时候算一次,以后不算,也可以查表,一样的
稳压,软启和保护做的怎么样
0
回复
2016-03-06 20:42
@想飞的狼
一个一个敲出来的啊RC滤波后引脚波形 [图片] 

单片机出来后经过RC和LC的波形不一样。

LC才行?

0
回复
2016-05-08 22:11
@锦瑟年华0
稳压,软启和保护做的怎么样
好贴
0
回复
zhouboak
LV.8
14
2016-05-16 21:07
@空军通信兵
好贴

0
回复
ruohan
LV.9
15
2016-05-19 17:24
@zhouboak
zhe chne
0
回复
dapeng
LV.5
16
2016-11-15 21:41

不错!不知能否把原理图奉献出来让大家学习下

0
回复
ruohan
LV.9
17
2016-11-16 09:31
@dapeng
不错!不知能否把原理图奉献出来让大家学习下
共享一下原理图,看看,怎么接的
0
回复
ruohan
LV.9
18
2016-12-08 16:42
@想飞的狼
系统初始化的时候算一次,以后不算

pwm_duty[i]=(unsigned int)(127+(float)127*sin(2*3.1415926*(float)i*0.2/(float)20));

讲解一下这个语句的意思

0
回复