马老师
您好!好不容易找到这个网站,感觉好象是找到救星了,希望您能够给我指点一二,在下不胜感激!
我的问题是这样的,我做的是用ATmega8控制spwm波形,频率保持不变,但要求对幅值进行调整,调整办法是通过匹配值乘或除一个系数.我的部分程序是这样的:
#include <iom8v.h>
#include <macros.h>
#pragma data:code
// 128点正弦波样本表
const unsigned int auc_SinParam[256] = {0, 6, 13, 19, 25, 31, 38, 44, 50, 56, 62, 69, 75, 81, 87, 92,
98, 104, 110, 115, 121, 127, 132, 137, 143, 148, 153, 158, 163, 168, 172, 177,
181, 186, 190, 194, 198, 202, 206, 210, 213, 217, 220, 223, 226, 229, 231, 234,
236, 239, 241, 243, 245, 246, 248, 249, 251, 252, 253, 253, 254, 255, 255, 255,
255, 255, 255, 254, 253, 253, 252, 251, 249, 248, 246, 245, 243, 241, 239, 236,
234, 231, 229, 226, 223, 220, 217, 213, 210, 206, 202, 198, 194, 190, 186, 181,
177, 172, 168, 163, 158, 153, 148, 143, 137, 132, 127, 121, 115, 110, 104, 98,
92, 87, 81, 75, 69, 62, 56, 50, 44, 38, 31, 25, 19, 13, 6, 0,
0, 6, 13, 19, 25, 31, 38, 44, 50, 56, 62, 69, 75, 81, 87, 92,
98, 104, 110, 115, 121, 127, 132, 137, 143, 148, 153, 158, 163, 168, 172, 177,
181, 186, 190, 194, 198, 202, 206, 210, 213, 217, 220, 223, 226, 229, 231, 234,
236, 239, 241, 243, 245, 246, 248, 249, 251, 252, 253, 253, 254, 255, 255, 255,
255, 255, 255, 254, 253, 253, 252, 251, 249, 248, 246, 245, 243, 241, 239, 236,
234, 231, 229, 226, 223, 220, 217, 213, 210, 206, 202, 198, 194, 190, 186, 181,
177, 172, 168, 163, 158, 153, 148, 143, 137, 132, 127, 121, 115, 110, 104, 98,
92, 87, 81, 75, 69, 62, 56, 50, 44, 38, 31, 25, 19, 13, 6, 0
};
#pragma data:data
void timer2_ovf_isr(void);
void port_init(void);
void init_devices(void);
void adc_init(void);
unsigned char x_SW = 1,X_LUT = 0;
unsigned int adc_data;
float volt = 1.5; ????????
void main(void)
{
init_devices();
TCCR2 = 0x69; // 快速PWM模式,分频系数=1,正向控制OC0
TIMSK = 0x40; // T/C0溢出中断允许
SEI(); // 使能全局中断
//for (;;)
while(1)
{}
}
#pragma interrupt_handler timer2_ovf_isr:5
void timer2_ovf_isr(void)
{
if (X_LUT >255)
{ X_LUT= 0; // 样点指针调整
}
//把AD采样值送给匹配寄存器
OCR2=(int)((float)((auc_SinParam[X_LUT])/volt+0.5));//把上面的数表除以1.5,四舍五入后取整,按理频率不会改变,但是以外的是滤波以后的正玄波频
率改变了,但是当把上面的数表重新除以1.5,四舍五入后取整重新建立一个新数表代替前面的
数表的,赋 给匹配值,这个结果很好,频率没有改变,这到底是怎么回事情啊 ???????????
// 取样点指针到比较匹配寄存器
X_LUT += x_SW; // 新样点指针
}
void port_init(void)
{
PORTB = 0xFF;
DDRB = 0xFF;
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0xFF;
DDRD = 0xFB;
}
//call this routine to initialise all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x00;
port_init();
adc_init();
} //timer interrupt sources
//re-enable interrupts
//all peripherals are now initialised
而且假如把float volt = 1.5;改成int volt=1 , OCR2=(int)((float)((auc_SinParam[X_LUT])/volt+0.5));改成OCR2=(int)(auc_SinParam[X_LUT])/volt);频率竟然改变了,真的很奇怪,不就把赋了个变量么?问题怎么会这么严重,难道非要写成
OCR2=auc_SinParam[X_LUT];才对吗,哪个volt是AD采样值,必须的用.
救救我吧,马老师! |