pwm音频输出
怎么配置ATmega16 T/C1的pwm功能输出工作频率为20kHZ 时钟多少? tam2907 发表于 2014-3-20 17:00时钟多少?
主时钟8MHZ,用ICCAVR PWM载波必须高于20k。否则噪音很大。
建议的音频重放PWM载波频率要大于40k。
如果是简单的语音PWM重放。大约15K左右的PWM就可以。不过一定要选择好滤波器参数。否则就会呵呵 用ICCAVR自带的Application builder初始化就可以了 skyxjh 发表于 2014-3-20 18:49
用ICCAVR自带的Application builder初始化就可以了
呵呵,接触AVR时间不是很长,不懂得用库函数 xwkm 发表于 2014-3-20 18:43
PWM载波必须高于20k。否则噪音很大。
建议的音频重放PWM载波频率要大于40k。
如果是简单的语音PWM重放。大 ...
我这个主要是把nRF24l01发送过来的音频信号转换成pwm还原声音,需要与发送端的采样速率相同,顺便想问一下采样速率是ADC的转换速率吗,还是每秒钟ADC转换多少次,ADC工作在自动触发状态 每秒钟ADC转换多少次 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;//接收模式;
}
} 过来看看 PWM载波频率不是ADC采样频率。用20K滤波不足你会后悔的
页:
[1]