求一个程序,Atmega8中,用电位器控制10khz脉冲波的占空比(10%——90%)(注:似乎要用到ad转换器)
发布网友
发布时间:2022-04-29 11:45
我来回答
共2个回答
热心网友
时间:2023-10-05 10:14
电位器3脚接地,1脚接正,2脚接ad0
unsigned int ad0;//定义个变量,用于存储ad值
//下面是pwm的初始化 需要什么频率或特殊效果,自己修改下寄存器,我乱设了个频率。
void pwm_init(void)
{
TCCR1B = 0x00;//停止定时器
TIMSK |= 0x00;//中断允许
TCNT1H = 0x00;
TCNT1L = 0x00;//初始值
OCR1AH = 0x00;
OCR1AL = 0x00;//匹配A值
OCR1BH = 0x00;
OCR1BL = 0x00;//匹配B值
ICR1H = 0xFF;
ICR1L = 0xFF;//输入捕捉匹配值
TCCR1A = 0xA1;
TCCR1B = 0x03;//启动定时器
}
//下面是ad部分
#pragma interrupt_handler adc_isr:iv_ADC //连续ad中断定义
void adc_init(void) //连续ad初始化
{
ADCSRA = 0x00;
ADMUX=0x40;
ACSR =(1<<ACD);//关闭模拟比较器
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0) ;//128分频
ADCSRA&=~(1<<ADSC);
}
//ADC完成中断
void adc_isr(void) //连续ad中断程序
{
ad0=ADC;
OCR1A=AD0<<2;//pwm输出等于10位ad值除以4 至于要压缩到10%~90%之间,自己套个公式吧,方法给你了。结果还是要靠自己,才能有进步
ADMUX=0X40;//设定下次转换的ad口
ADCSRA|=(1<<ADSC);//启动AD转换
热心网友
时间:2023-10-05 10:14
需要用到AD采集电位器的滑动端电压,然后把这个电压值转换成PWM值,使用快速PWM或是相位修正PWM都行。看下mega8的手册就会用了。 很简单的。追问恩,方法我大致知道,但是对程序不太熟悉,能不能给我发个程序,因为有急用……多谢兄台了