pz91 发表于 2014-3-20 15:26:19

pwm音频输出

怎么配置ATmega16 T/C1的pwm功能输出工作频率为20kHZ

tam2907 发表于 2014-3-20 17:00:34

时钟多少?

pz91 发表于 2014-3-20 17:16:27

tam2907 发表于 2014-3-20 17:00
时钟多少?

主时钟8MHZ,用ICCAVR

xwkm 发表于 2014-3-20 18:43:10

PWM载波必须高于20k。否则噪音很大。
建议的音频重放PWM载波频率要大于40k。
如果是简单的语音PWM重放。大约15K左右的PWM就可以。不过一定要选择好滤波器参数。否则就会呵呵

skyxjh 发表于 2014-3-20 18:49:41

用ICCAVR自带的Application builder初始化就可以了

pz91 发表于 2014-3-20 18:59:01

skyxjh 发表于 2014-3-20 18:49
用ICCAVR自带的Application builder初始化就可以了

呵呵,接触AVR时间不是很长,不懂得用库函数

pz91 发表于 2014-3-20 19:08:41

xwkm 发表于 2014-3-20 18:43
PWM载波必须高于20k。否则噪音很大。
建议的音频重放PWM载波频率要大于40k。
如果是简单的语音PWM重放。大 ...

我这个主要是把nRF24l01发送过来的音频信号转换成pwm还原声音,需要与发送端的采样速率相同,顺便想问一下采样速率是ADC的转换速率吗,还是每秒钟ADC转换多少次,ADC工作在自动触发状态

skyxjh 发表于 2014-3-20 19:15:51

每秒钟ADC转换多少次

pz91 发表于 2014-3-20 19:22:01

skyxjh 发表于 2014-3-20 19:15
每秒钟ADC转换多少次

要求pwm频率20KHZ(我自己设计的),上传一份别人写的程序和他一样也行,我看不懂

#include <avr/io.h>
#include <avr/interrupt.h>
#include "24l01.h"
#include "config.h"
uint8_t volatile play=0,byte_count=0,sta;
uint8_t volatile RX_BUF;
uint8_t present_AD=0;
uint8_t volatile SPEED=128;
void timer0_init(void)
{
        TIFR=TIFR;      
        sbi(TCCR0,WGM01);                         // CTC 模式
        sbi(TCCR0,CS00);                                  //配置时钟
    OCR0= SPEED;       
        sei();       
}
void pwm_init(void)
{
        DDRD=DDRD | (1<<DDC4) | (1<<DDC5); //M16的OC1A,OC1B为输出引脚
        PORTD=PORTD & (~((1<<PD4) | (1<<PD5))); //M16的OC1A,OC1B为输出0电平
        TCCR1A=0x00;
        TCCR1B=0x00;
        TCCR1A=TCCR1A | (1<<COM1A1) | (1<<COM1B1) | (1<<WGM10) ;//比较匹配时清0,8位快速PWM
        TCCR1B=TCCR1B | (1<<WGM12)| (1<<CS10);
}
void interrupt_init(void)
{       
        //下降沿触发;
        sbi(MCUCR,ISC11);
        sbi(MCUCR,ISC01);
        sbi(GICR,INT0);//使能外部中断0
        sbi(GICR,INT1);//使能外部中断1
}
//调节pwm频率;
ISR(INT0_vect)
{
        SPEED++;
        OCR0=SPEED;
        sbi(GIFR,INTF0);
}
ISR(INT1_vect)
{
        SPEED--;
        OCR0=SPEED;
        sbi(GIFR,INTF1);
}
//adc中断程序,最高采样率;为了保持与发射端相同频率,在此处理数据;
ISR(ADC_vect)
{
        present_AD= ADCH;
        if (play)
        {
                DDRD|=(1<<PD4);
                OCR1A=RX_BUF;
                RX_BUF=0;
                byte_count++;
                if (byte_count==32)
                {
                        byte_count=0;
                        play=0;
                }
        }
        else
        {
                DDRD&=~(1<<PD4);        //没有数据时设置为输入,防止产生高频噪声;
        }
        OCR1B=present_AD;
        TIFR=TIFR;
        sbi(ADCSRA, ADIF);
}


int main(void)
{
        init_NRF24L01();
        SetRX_Mode();
        interrupt_init();
        pwm_init();
        timer0_init();
        a2dInit();
    while(1)
    {
                sta=SPI_Read(STATUS);      // 读取状态寄存其来判断数据接收状况;
                if(sta&RX_DR)               // 判断是否接收到数据RX_DR==1?
                {       
                       
                        Low_24L01_CE;    //SPI使能
                        SPI_Read_Buf(RD_RX_PLOAD,RX_BUF,TX_PLOAD_WIDTH);// 读取接收数据;
                        SPI_RW_Reg(WRITE_REG + STATUS, sta);    //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
                        play=1;
                }
                Hign_24L01_CE;//接收模式;
    }
}

desireyao 发表于 2014-3-20 19:50:29

过来看看

xwkm 发表于 2014-3-21 07:14:01

PWM载波频率不是ADC采样频率。用20K滤波不足你会后悔的
页: [1]
查看完整版本: pwm音频输出