This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:Code Composer Studio
您好!
我叫 Trujillo、我来自西班牙。 首先,我对我可能会犯的任何英文书写错误表示歉意。
实际上、我使用的是 MSP430FR5969、我尝试从计时器 A 中断生成 PWM 信号(计时器 B)(在可闻频率范围内)。 我发现的问题是来自 Timer B 的 PWM 信号显示正确、但我需要来自 Timer A 的 PWM 保持工作。 最后一点不会发生。 ISR 似乎有很多工作要做、CPU 处理速度无法达到我所需的速度。 这是守则,如果有人能帮助我,我将会非常感激。
#include #include unsigned int mostra (void); unsigned int valor=0; unsigned long resultats=0.0; unsigned int vector[48]={0}; unsigned int puntero=0; unsigned long Mitja=0.0; // * main.c * / int main (void){ WDTCTL = WDTPW | WDTHOLD; //停止 WDT //配置 GPIO ------------------------------------------------------- // P1DIR |= BIT2; P1SEL0 |= BIT2; P1DIR |= BI5; P1SEL0 &=~BI5; P1DIR = 0x10; P1SEL0 = 0x10; P4SEL0 |= BIT4; P4SEL1 |= BIT4; //禁用 GPIO 上电默认高阻抗模式,以激活 //先前配置的端口设置 PM5CTL0 &=~LOCKLPM5; //--- //// configuración de los clocks //------------------------------------------------------- // CSCTL0_H = CSKEY >> 8; //解锁 CS 寄存器 CSCTL1 = DCOFSEL_6; CSCTL2 = SELA_VLOCLK | SELS__DCOCLK | SELM_DCOCLK; CSCTL3 = DIVA_8 | DIVS_8 | DIVM__1; CSCTL0_H = 0; //----------------- /////// configuración ó n del ADC12 //--------------- // ADC12CTL0 = ADC12SHT1_0 | ADC12ON; ADC12CTL1 = ADC12SHP | ADC12SSEL_3 | ADC12PDIV_1 | ADC12CONSEQ_0; ADC12CTL2 =ADC12RES_2; ADC12CTL3 = ADC12C12PDIV_1 | ADC12CONSEQ0;ADC12CTL2 =ADC12TRC12TAC10 = ADC12MCTR_ADC12TAC0;ADC12TALL_ADC12TAC10;ADC12TRC12TACTR ///---------------------------------------------------------- /////// configuración de la Señal PWM Principal //--------------- // TA1CTL = tassel_SMCLK | MC__UP | TACLR; TA1CCR0 = 2325-1; TA1CCTL1 = OUTMOD_7; TA1CCR1 = 1850; TA1CCTL2 = CCIE; TA1CCR2 = 1965年; //----------------- // __bis_SR_register (LPM0_bits+GIE);//输入 LPM0 y generamos la ISR while (1){}; }//------ ISR -------------------------------------------------------------- // #pragma vector=Timer1_A1_vector // INTERRUPCIÓN EN Timer1:TA1.1 __interrupt void Temp (void) { switch (TA1IV) { case 4:// interrupción en TA1CCR2 mistra(); int i; vector[puntero]=mustra(); if (puntero=47){ puntero=0; for (i=0;i<48;i++){ Mitja=Mitja+vector[i]; } tattat=Mitja/48; if (resultat<<205){ resultat=205.0; } //--- configuración de la Señal PWM de salida de audio para localización -------- // TB0CTL = TBSSEL_SMCLK | MC__UP | CNTL_1 | TBCLR; TB0CCTL1 = OUTMOD_7; TB0CCR0 =(409600/结果)-1; TB0CCR1 = TB0CCR0/2; Mitja=0; resulttat=0.0; } 否则 为 puntero++; break; } TA1CTL &&~TAIFG; } //------ ADC12------------------------------------------------------- // unsigned int motra (void) { ADC12MEM10=0; ADC12CTL0 |= ADC12ENC | ADC12SC; while (((ADC12CTL0&ADC12SC)=ADC12SC){}; valor=ADC12MEM10; ADC12CTL0 &=~ADC12ENC; return valor; }
非常感谢!
Trujillo
人能听到的东西相当慢。
硬件 PWM 永远不会错过任何节拍、它是否可以因 ISR 占用系统而跳过更改、是的。
您正在使用 timerB 硬件 PWM 来生成1-2 KHz 范围内的音调?
您需要根据 ADC12采样值更改音调吗?
您是否无法使用 timerB IRQ 读取最后一个 ADC 样本、然后 触发另一个 ADC12采样?
可以使用:如果(!++跳过和7)、如果您只想在 ISR 运行时每八次执行一次。
不要在 ISR 中执行复杂的数学运算。
永远 不会从 执行标志硬件轮询的 ISR 执行函数调用。
运行均值将数学分解为较小的片段、减少了占用系统的风险:
unsigned int temp = ADC12MEM;
battery.volt=(temp+battery.volt*3)/4;//平均3/4 OLD + 1/4 NEW