精华内容
下载资源
问答
  • pwm产生正弦波

    2011-10-18 23:47:47
    很好的,对于出学32,想用pwm产生正弦波的同学很有帮助
  • 基于PIC单片机PWM正弦波
  • 该资源是采用STM32的PWM产生1KHZ的正弦波,绝对好使
  • 基于STM32单片机PWM正弦波仿真设计包含源程序及仿真文件
  • 原创哦,CSDN首发 用51单片机的两定时器产生更精准的正弦PWM波,还带有Proteus仿真文件
  • 用AVR单片机产生正弦波信号

    千次阅读 2013-12-28 13:55:40
    用AVR单片机产生正弦波信号 使用AVR定时/计数器的PWM功能设计要点 一、定时/计数器PWM设计要点 根据PWM的特点,在使用ATmega128的定时/计数器设计输出PWM时应注意以下几点: 1.首先应根据实际的情况,...

    用AVR单片机来产生正弦波信号

    使用AVR定时/计数器的PWM功能设计要点

    一、定时/计数器PWM设计要点

    根据PWM的特点,在使用ATmega128的定时/计数器设计输出PWM时应注意以下几点:

    1.首先应根据实际的情况,确定需要输出的PWM频率范围,这个频率与控制的对象有关。如输出PWM波用于控制灯的亮度,由于人眼不能分辨42Hz以上的频率,所以PWM的频率应高于42Hz,否则人眼会察觉到灯的闪烁。

    2.然后根据需要PWM的频率范围确定ATmega128定时/计数器的PWM工作方式。AVR定时/计数器的PWM模式可以分成快速PWM和频率(相位)调整PWM两大类。

    3.快速PWM可以的到比较高频率的PWM输出,但占空比的调节精度稍微差一些。此时计数器仅工作在单程正向计数方式,计数器的上限值决定PWM的频率,而比较匹配寄存器的值决定了占空比的大小。PWM频率的计算公式为:

    PWM频率 = 系统时钟频率/(分频系数*(1+计数器上限值))

    4.快速PWM模式适合要求输出PWM频率较高,但频率固定,占空比调节精度要求不高的应用。

    5.频率(相位)调整PWM模式的占空比调节精度高,但输出频率比较低,因为此时计数器仅工作在双向计数方式。同样计数器的上限值决定了PWM的频率,比较匹配寄存器的值决定了占空比的大小。PWM频率的计算公式为:

    PWM频率 = 系统时钟频率/(分频系数*2*计数器上限值))

    6.相位调整PWM模式适合要求输出PWM频率较低,但频率固定,占空比调节精度要求高的应用。当调整占空比时,PWM的相位也相应的跟着变化(Phase Correct)。

    7.频率和相位调整PWM模式适合要求输出PWM频率较低,输出频率需要变化,占空比调节精度要求高的应用。此时应注意:不仅调整占空比时,PWM 的相位会相应的跟着变化;而一但改变计数器上限值,即改变PWM的输出频率时,会使PWM的占空比和相位都相应的跟着变化(Phase and Frequency Correct)。

    8.在PWM方式中,计数器的上限值有固定的0xFF(8位T/C);0xFF、0x1FF、0x3FF(16位T/C)。或由用户设定的 0x0000-0xFFFF,设定值在16位T/C的ICP或OCRA寄存器中。而比较匹配寄存器的值与计数器上限值之比即为占空比。

    二、 PWM应用设计参考

    下面给出一个设计示例,在示例中使用PWM方式来产生一个1KHz左右的正弦波,幅度为0-Vcc/2。

    首先按照下面的公式建立一个正弦波样本表,样本表将一个正弦波周期分为128个点,每点按7位量化(127对应最高幅值Vcc/2):

    f(x) = 64 + 63 * sin(2πx/180) x∈[0…127]

    如果在一个正弦波周期中采用128个样点,那么对应1KHz的正弦波PWM的频率为128KHz。实际上,按照采样频率至少为信号频率的2倍的取样定理来计算,PWM的频率的理论值为2KHz即可。考虑尽量提高PWM的输出精度,实际设计使用PWM的频率为16KHz,即一个正弦波周期(1KHz)中输出 16个正弦波样本值。这意味着在128点的正弦波样本表中,每隔8点取出一点作为PWM的输出。

    程序中使用ATmega128的8位T/C0,工作模式为相位调整PWM模式输出,系统时钟为8MHz,分频系数为1,其可以产生最高PWM频率为: 8000000Hz / 510 = 15686Hz。每16次输出构成一个周期正弦波,正弦波的频率为980.4Hz。PWM由OC0(PB4)引脚输出。参考程序如下(ICCAVR)。

    //ICC-AVR application builder : 2004-08

    // Target : M128

    // Crystal: 8.0000Mhz

    #i nclude

    #i nclude

    #pragma data:code

    // 128点正弦波样本表

    const unsigned char auc_SinParam[128] = {

    64,67,70,73,76,79,82,85,88,91,94,96,99,102,104,106,109,111,113,115,117,118,120,121,

    123,124,125,126,126,127,127,127,127,127,127,127,126,126,125,124,123,121,120,118,

    117,115,113,111,109,106,104,102,99,96,94,91,88,85,82,79,76,73,70,67,64,60,57,54,51,48,

    45,42,39,36,33,31,28,25,23,21,18,16,14,12,10,9,7,6,4,3,2,1,1,0,0,0,0,0,0,0,1,1,2,3,4,6,

    7,9,10,12,14,16,18,21,23,25,28,31,33,36,39,42,45,48,51,54,57,60};

    #pragma data:data

    unsigned char x_SW = 8,X_LUT = 0;

    #pragma interrupt_handler timer0_ovf_isr:17

    void timer0_ovf_isr(void)

    {

    X_LUT += x_SW; // 新样点指针

    if (X_LUT > 127) X_LUT -= 128; // 样点指针调整

    OCR0 = auc_SinParam[X_LUT]; // 取样点指针到比较匹配寄存器

    }

    void main(void)

    {

    DDRB |= 0x10; // PB4(OC0)输出

    TCCR0 = 0x71; // 相位调整PWM模式,分频系数=1,正向控制OC0

    TIMSK = 0x01; // T/C0溢出中断允许

    SEI(); // 使能全局中断

    while(1)

    {……};

    }

    每次计数器溢出中断的服务中取出一个正弦波的样点值到比较匹配寄存器中,用于调整下一个PWM的脉冲宽度,这样在PB4引脚上输出了按正弦波调制的PWM方波。当PB4的输出通过一个低通滤波器后,便得到一个980.4Hz的正弦波了。如要得到更精确的1KHz的正弦波,可使用定时/计数器T /C1,选择工作模式10,设置ICR1=250为计数器的上限值。

    在ATMEL公司网站上,给出了使用一个定时/计数器实现双音频拨号的应用设计参考(AVR314.pdf),读者可以从中学习到如何更好设计和使用PWM的功能。

    f(x) = 64 + 63 * sin(2πx/128) x∈[0…127]

    这个问题我也弄过好长一段时间。

    在编号为 AVR314 的 Application Note 中,这个讲得很详细。

    在这个 note 中,因为正弦波最终用于高、低频的叠加以生成DTMF信号,所以就用了7位来存储正弦表。7位最大为127

    而f(x)=sin(x)的值域为[0…1],所以,63 * sin(2πx/128)就放大了值域。

    再加64,则将值全部上移为正,满足存储要求。

    展开全文
  • 这是基于MSP430F5529单片机实现的PWM程序,最后输出的正弦波,通过改变占空比实现。
  • Proteus之51MCU学习之路--如何用PWM波产生正弦波

    万次阅读 多人点赞 2016-08-03 12:05:06
    PWM产生正弦波的要点如下: 1、PWM波的频率(F_PWM)与正弦波频率(F_SIN)之间的对应关系与采样点数(S_NUM)有着密切的关系,即F_SIN=F_PWM/S_NUM; 2、PWM波如何变成正弦波; 3、用方波对正弦波进行采样 4、如何让...
     PWM产生正弦波的要点如下:
    1、PWM波的频率(F_PWM)与正弦波频率(F_SIN)之间的对应关系与采样点数(S_NUM)有着密切的关系,即F_SIN=F_PWM/S_NUM。举个简单的例子,如你要产生的正弦波频率为50Hz,若采样点数为20,则MCU产生的PWM波的频率=50*20hz=1000Hz。
    2、PWM波如何变成正弦波
     这个问题我问过郭老师,郭老师只有用低通滤波器就可以了,一头雾水啊,虽然我明白方波信号是由不同频率不同幅值的正弦信号相加减得到,但这样的说法,终难让我彻底明白,网上所查资料也是这样说,没办法,看来要想真正理解只有自己实践一把了,经过2天的努力终于弄明白了,要把这个讲清楚,就要先说说低通滤波器了。
    (1)低通滤波器主要由RC元件组成,其中以一阶无源低通滤波器最简单如图1所示,低通滤波器的作用是滤除高频信号,那么就会有一个疑问:方波是不是还是方波呢?
    (2)实际上RC电路除了是低通滤波器外,还是积分电路,如图2所示。你仔细分析一下,就会发现,图2积分电路与图1低通滤波器,在电路本质上是没有区别了,换句话说一阶RC低通滤波器除了滤除高频信号,还有一个更重要的作用就是积分。
     结论:PWM波产生正弦波主要是运用了一阶RC低通滤波器的积分作用。积分电路可将方波变成三角波,可那也不是正弦波啊,估计同学们一定会这样想,我也是这样想的,接下来我们就来把这个问题讲清楚。
    3.用方波对正弦波进行采样
     方波实际上就是PWM波,如图3所示,我们对一个确定的正弦信号用PWM波进行采样,采样的前提是PWM波的占空比要按照正弦规律变化即可。那么会有同学会问,这样做只能对正弦波的正半轴采样啊,哪负半周怎么办。一种解决办法,就是生成2路PWM波,但这2路PWM波反相,这次电赛就是用的这种办法,并且MCU是强大的STM32。而我在家只有一台电脑,故只有51单片机实现,51单片机的定时器有2个,能产生一路PWM波就不错了,这里要非常感谢长江大学的武洪涛老师无私提供的仿真资料,让我起步容易了很多,也借鉴了武老师PWM波的程序,看了好长时间没看懂,又不好意思问(这一点不要向我学习啊),最后还是用自己的方法写出来了。
    4.如何让占空比按照正弦规律变化
     最简单的方法就是使用Excel表格的正弦函数了,注意Excel的正弦函数使用弧度表示的了,所以你要先将角度用弧度表示。我将360°分成36等分,从10°一直到360°,再讲度数换算成弧度,然后在得出度数对应的正弦函数值,很显然有一半是负数,仔细观察发现负数的最大值是-1,于是我想出了一个好办法,将所有的函数值加1然后再除以2,不久可以使所有的正弦函数值都为正,然后让所有的正弦函数值与PWM波的占空比对应起来就可以了。 讲完了,就写这么多了,有不懂的就问我了。 本人蹉跎了太多的年轻的大好时光,打游戏、看电影、玩手机是我的最爱,所以到现在也没有啥成就,就是在混日子,反而让自己的精神状态更差。现在回头看看曾经的自己,做了太多没有意义的事情,对自己对他人都没有帮助和提升,那么我在接下来的岁月中就应该好好做一些事情,让自己的能力慢慢提升起来,同时也能给他人提供一些参考和帮助,那么这样就会让自己的人生变得更加有意义!
    展开全文
  • PIC16F877A 利用PWM输出50HZ正弦波单片机外部要接滤波电路)
  • 针对Motorola DSP56F805的PWM模块中不能产生高频正弦波的缺点,根据SPWM原理,由直接面积等效法,计算出对应脉冲的起始点和终点,然后编程实现,经调试发现调制出的正弦波具有良好的特性。 DSP56F805是一种专门用来...
  • 使用PIC单片机进行三相正弦波变频电源的设计pdf,三相逆变控制常用的方式有三种:一是基于可编程逻辑器件的对称规则采样法,产生SPWM信号以实现逆变控制 ; 二是利用DSP芯片产生SPWM信号以实现逆变控制 三是用专用芯片...
  • 升压级PWM驱动及逆变级SPWM驱动均由STM32单片机产生,减小了硬件开支。基于上述方案试制的400 W样机,具有输出短路保护、过流保护及输入过压保护、欠压保护功能,50 Hz输出时频率偏差小于0.05 Hz,满载(400 W)效率...
  • 用c编写…… 编译软件是keil2…… 仿真软件是protues……
  • IAR开发环境下用STM8单片机生成3组不同的正弦波波形数据,并通过串口发送出来,并在串口波形软件上显示发送的波形。
  •  //设置占空比 // CCR1 PWM Duty Cycle CCR0 = 1; //设置周期 // Clock period of CCR0 TACTL = TASSEL_2 + MC_1; //定时器A的时钟源为SMCLK=8M,增计数模式 // SMCLK, upmode _BIS_SR(CPUOFF); // CPU off }

    #include  

    //------------------------------------------------------------------------------

    // 12-bit Sine Lookup table with 32 steps

    //------------------------------------------------------------------------------

    static int Sin_tab[32] = { 0x7FF,0xA78,0xCB2,0xE77,0xF9A,0xFFE,0xF9A,0xE77,0xCB2,0xA78,0x7FF,0x586,0x34C,0x187,0x064,0x000

    ,0x064,0x187,0x34C,0x586};

    static int Cos_tab[32] = { 0xFFE,0xF9A,0xE77,0xCB2,0xA78,0x7FF,0x586,0x34C,0x187,0x064,0x000

    ,0x064,0x187,0x34C,0x586,0x7FF,0xA78,0xCB2,0xE77,0xF9A};

    void main(void)

    {

    volatile unsigned int i;

    WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT

    //==========================选择高频振荡器=======================================

    BCSCTL1 &= ~XT2OFF;                       // XT2= HF XTAL

    do

    {

    IFG1 &= ~OFIFG;                           // Clear OSCFault flag

    for (i = 0xFF; i > 0; i--);               // Time for flag to set

    }

    while ((IFG1 & OFIFG)); //查看8M的震荡是否稳定  // OSCFault flag still set?

    BCSCTL2 |= SELM_2 + SELS; //MCLK和SMCLK选择XT2// MCLK= SMCLK= XT2 (safe)

    //================================================================================

    ADC12CTL0 = REF2_5V + REFON;//内部基准电压      // Internal 2.5V ref

    //================================================================================

    DMACTL0 = DMA0TSEL_5 + DMA1TSEL_5;        // DAC12IFG trigger触发器

    DMA0SA = (int) Sin_tab;//首地址           // Source block address

    DMA0DA = (int)&DAC12_0DAT; //目的地址     // Destination single address

    DMA0SZ = 0x14;       //长度               // Block size

    DMA0CTL = DMADT_4 + DMASRCINCR_3 + DMAEN; // Rpt, inc src, word-word

    DMA1SA = (int) Cos_tab;  //首地址          // Source block address

    DMA1DA = (int)&DAC12_1DAT; //目的地址      // Destination single address

    DMA1SZ = 0x14;       //长度                // Block size

    DMA1CTL = DMADT_4 + DMASRCINCR_3 + DMAEN;  // Rpt, inc src, word-word

    DAC12_0CTL = DAC12LSEL_2 + DAC12IR + DAC12AMP_5 + DAC12IFG + DAC12ENC + DAC12GRP;

    DAC12_1CTL = DAC12LSEL_2 + DAC12IR + DAC12AMP_5 + DAC12IFG + DAC12ENC;

    CCTL1 = OUTMOD_3;//置位复位模式           // CCR1 set/reset

    CCR1 = 1;    //设置占空比                 // CCR1 PWM Duty Cycle

    CCR0 = 1; //设置周期                     // Clock period of CCR0

    TACTL = TASSEL_2 + MC_1; //定时器A的时钟源为SMCLK=8M,增计数模式 // SMCLK, upmode

    _BIS_SR(CPUOFF);                          // CPU off

    }

    展开全文
  • 介绍了一种正弦波输出的逆变电源的设计。设计中采用了DC/DC和DC/AC两级变换,高频变压器隔离,单片机控制。实验结果表明性能可靠。PICl6C73是Microchip公司的一款中档单片机,它功能强大而又价格低廉。PICl6C73内部...
  • 前面的文章介绍了单片机控制步进电机四相四拍、四相八拍的...首先需要准备下stm32的正弦波PWM表,可以用EXCEL生成。 配置单片机定时器的PWM输出。 void TIM_Config(void) { GPIO_InitTypeDef GPIO_InitStru...

    前面的文章介绍了单片机控制步进电机四相四拍、四相八拍的方式。用的是持续电平驱动,这种驱动方式电机的噪音大,震动明显,下面介绍正弦波驱动方式,这种方式能很好的解决噪音和震动问题。

    首先需要准备下stm32的正弦波PWM表,可以用EXCEL生成。

    配置单片机定时器的PWM输出。

    void TIM_Config(void)
    {
      GPIO_InitTypeDef GPIO_InitStructure;
            TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
            TIM_OCInitTypeDef  TIM_OCInitStructure;
            NVIC_InitTypeDef NVIC_InitStructure;
            
            RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
            GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_Init(GPIOA, &GPIO_InitStructure);
            
            TIM_TimeBaseStructure.TIM_Period=512;        
            TIM_TimeBaseStructure.TIM_Prescaler= 7;        
            TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;                
            TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;                
            TIM_TimeBaseStructure.TIM_RepetitionCounter=0;        
            TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
    
            TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
            TIM_OCInitStructure.TIM_Pulse=512;                 
            TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
            TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
            
            TIM_OC1Init(TIM1, &TIM_OCInitStructure);
            TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
            TIM_OC2Init(TIM1, &TIM_OCInitStructure);
            TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
            TIM_OC3Init(TIM1, &TIM_OCInitStructure);
            TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);
            TIM_OC4Init(TIM1, &TIM_OCInitStructure);
            TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);
            
            TIM_ARRPreloadConfig(TIM1, ENABLE);        
            TIM_Cmd(TIM1, ENABLE);
            
      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
      
      NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init(&NVIC_InitStructure);                                                                                                 
            
            TIM_CtrlPWMOutputs(TIM1,ENABLE);
            TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);                                                                                
    }

    配置定时器的数据更新中断,在中断里更新CCR的值改变占空比。

    void TIM1_UP_IRQHandler(void)
    {        
            if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)        
             {                
                    pwm1_index++;if(pwm1_index>36)pwm1_index=0;
                    pwm2_index++;if(pwm2_index>36)pwm2_index=0;
                    pwm3_index++;if(pwm3_index>36)pwm3_index=0;
                    pwm4_index++;if(pwm4_index>36)pwm4_index=0;
                    TIM1->CCR1 = indexWave[pwm1_index];        
                    TIM1->CCR2 = indexWave[pwm2_index];        
                    TIM1->CCR3 = indexWave[pwm3_index];        
                    TIM1->CCR4 = indexWave[pwm4_index];        
                    TIM_ClearITPendingBit (TIM1, TIM_IT_Update);        
            }
    }

    至此可以看到定时器输出的符合正弦波规律的PWM波。

    可以对比下用正弦波代替持续电平的效果

    展开全文
  • 前面几期给读者介绍了单片机+CPLD 系统设计,本篇继续挖掘CPLD 潜力,给出一种单片机驱动CPLD的PWM 正弦信号发生器设计,充分体现了CPLD 的灵活多变,配合单片机控制,其妙无穷,以下方案均在Mini51 板上实现。...
  • 使用51单片机实现双机...单片机2使用定时器T0在P1.0以PWM方式连续输出接收的正弦波,中断方式实现,接有源RC滤波器,虚拟示波器显示波形; 3、单片机1收到应答信号后,用一位数码管显示收到单片机2的应答,通信成功。
  • 单片机,电池,滤波器,PWM,摘要:介绍了一种正弦波输出的逆变电源的设计。设计中采用了DC/DC和DC/AC两级变换,高频变压器隔离,单片机控制。实验结果表明性能可靠。
  • 单片机程序,单正弦波输出,幅度和频率可调节,频率表可以根据自己需求修改
  • 使用MEGA16单片机,方正正弦波PWM,控制IGBT。
  • 四路PWM 电压2.5V 正弦波

    千次阅读 2019-05-20 15:32:44
    /********************************************************...电压2.5伏 正弦波 **********************************************************/ #include"iostm8s208mb.h"//主控芯片的头文件 #include “stdio.h”...
  • 前面几期给读者介绍了单片机+CPLD 系统设计,本篇继续挖掘CPLD 潜力,给出一种单片机驱动CPLD的PWM 正弦信号发生器设计,充分体现了CPLD 的灵活多变,配合单片机控制,其妙无穷,以下方案均在Mini51 板上实现。...
  • 本程序实现的功能如下:1、配置 CAPCOM6。 2、使用 CC60,CC61,CC62,COUT60,COUT61,COUT62 作为 PWM 输出,工作于互补输出模式。3、在 T12 定时中断中,使各个通道的占空比按照 SPWM 规律变化,输出目标波形。
  • 描述目前,SPWM信号主要有3种生成方式:1)使用比较器、振荡器等模拟电路产生三角和方进行比较,产生SPWM,但是此种...3)利用单片机等微处理器产生SPWM,此方法控制电路简单,调节灵活,硬件成本低。本文介绍...
  • 文章目录使用资源定时器高级定时器11....控制PA8(TIM1CH1)PWM 输出对应频率至蜂鸣器引脚BUZ。 2.初始化配置 //////////////////////////////////////////////////////////////////////////////// void i
  • PIC单片机-PWM波

    千次阅读 2017-03-04 13:04:10
    一、编写程序,使用RC2的PWM功能生成频率250Hz的正弦波 #include #define uint8 unsigned char #define uint16 unsigned int __CONFIG(FOSC_HS &WDTE_OFF &BOREN_OFF &PWRTE_OFF &LVP_OFF); //设置配置位 //WDTE...
  • 摘要:介绍了传统的正弦能量分配交流净化稳压电源的基本原理及如何用高频斩单片机技术对其进行改造。 关键词:高频 目前,在各种交流稳压电源中,采用正弦能量分配技术的交流净化稳压电源是一种技术先进的稳压...
  • 本文介绍了一种基于开关损耗最小正弦PWM的直流无刷电机正弦波控制方案,并基于Infineon高性能8位单片机XC866进行了系统实现及验证。与传统的方波控制相比,由于采用正弦波驱动技术,电机运行噪声低,且开关损耗较...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 621
精华内容 248
关键字:

单片机pwm产生正弦波