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.

[参考译文] CCS/MSP432P401R:同步中断。 TimerA0和ADC14。

Guru**** 2535150 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/573156/ccs-msp432p401r-simultaneous-interrupts-timera0-and-adc14

部件号:MSP432P401R

工具/软件:Code Composer Studio

大家好,

我在使用MSP432P401R中断时遇到问题。 我用黑色版本(修订版 1.0)使用代码编辑器6.2 ,并且运行良好,两个中断执行正常。

我将我的主板升级到Rev C RED版本Code Composer 7,现在ADC14_IRQHandler没有执行,只有TA0_N_IRQHandler。 我尝试再次使用我的第一版黑色版本,但它是相同的。

我可以使ADC14 ISR工作的唯一方法是对NVIC偏移进行注释以设置定时器的中断,因此我只需启用ADC的NVIC偏移。  

我做错了吗? 提前感谢您的参与。

//*************************************************************************************************
////
control P-I para CONVERTIDOR full bridge
//////************************************************************************************************


#include "msp.h"


// definiciosNES para la frecuencia

#define frece 10万
#define msprun 4800万

int cuentas =(msprun/frec)/2;

// definion de variables
double periodo = 1/frec;
double d = 0.35 ;
double voltaje_anterado=0;
double media=0;
double mediosalida
= 0


int i =0;
int contador =0;
int muestras =0;

strt control {
双聚基;
双KP;
双重错误;
双设定点;
双错误间歇;
双重错误_前位;
双微积分;

/***** 变量del Mario***** //
ki = 0.0.0988万
// Kp = 0.0001 ;
/********************* /



INICIAlIZACIÓN // de Las estructuras
control ={ 0.0.0187万 ,0.0.0022万 };

//PROTOiPOS de funciones

void ADC_START (void);
void gPIO_config (void);
void timer_config (void);
void control_PI (void);


void main(void){

WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD;//停止监视程序计时器


ADC_START();
timer_config();
gPIO_CONFIG();

__enable_interrupts();

NVIC->ISER[0]=1<<(ADC14_IRQn)& 31);
NVIC->ISER[0]|=1<<(TA0_N_IRQn)和31);
NVIC->IP[9]=0;
NVIC->IP[24]=255;

//ENCIENDE EL ADC

ADC14->CTL0 |= ADC14_CTL0_ENC;

用于(i = 0;i < 5万;I++){}

用于(;){
//control_pi();
}

}

void control_pi (void){

control.error = control.setpoint - voltaje_promedio;
control.error_int =(control.error - control.error_anterior);

control.calculo = control.kp * control.error + control.error_int * control.ki;
Salida = control.calculo + salida_anterior;

// limitación del control para 0.01 < d < 0.48

IF (salida > 0.48){
D = 0.48 ;
}其他条件(salida <0){
D = 0.03 ;
其他{
D = salida;
}

control.error_anterior = control.error;
Salida_anterior = salida;

}

void ADC14_IRQHandler(void){

静态uint16_t状态= ADC14_IFGR0_IFG0;
ADC14->CLRIFGR0 |=1;
p4->out || BIT0;
__no_operation();
p4->out &=~BIT0;
状态= ADC14->MEM[0];

//公式para el factor de medición (VOUTMAS/2^14)
voltaje_sensado =(状态* 0.71.4411万);

//Promedio de Muestras

IF (contador == muestras){

voltaje_promedio = suma / muestras;
Suma =0;
contador = 0;
其他{

Suma = voltaje_sensado + suma;
contador++;
}
}

void timer_config (void){

TIMER_A1->CTL = TIMER_A_CTL_MC__UP | TIMER_A_CTL_Ssel__SMCLK
| TIME_A_CTL_ID__8;
TIMER_A1->CCTL[1]= TIMER_A_CCTLN_OUTMOD_3;
TIME_A1->CCR[0]=60;
TIME_A1->CCR[1]=30;

timer_A0->CTL = timer_a_ctl_mc_updown | timer_a_ctl_sel__SMCLK
| TIME_A_CTL_IE;
TIME_A0->CCR[0]=240;

TIME_A0->CCTL[2]= TIME_A_CCTLN_OUTMOD_6;
TIME_A0->CCR[2]=(int)(240 -(240 * d));

TIME_A0->CCTL[3]= TIMER_A_CCTLN_OUTMOD_2;
timer_A0->ccr [3]=(int)(240 * d);
}

void gPIO_config (void){

//Habilida los 2.5 和WFP 2.6 para usarse como salidas del timo.
P2->DIR ||(BIT6 | BIT5);
P2->SEL1 &=~( BIT6 | BIT5 );
P2->SEL0 ||( BIT6 | BIT5 | BIT2);

//Configura GPIO参数ADC
P4->DIR ||(BIT7);
P4->SEL0 ||(BIT7);
P4->SEL1 ||(BIT7);

//Salida para checar frecuencia de muestreo
P4->DIR ||(BIT0);
P4->SEL0 &=~(BIT0);
P4->SEL1 &=~(BIT0);
}

void ADC_START (void){

ADC14->CTL0 =(ADC14_CTL0_ssel__SYSCLK | ADC14_CTL0_DIV_0
| ADC14_CTL0_PDIV_0);// SYSCLK,/1,PrE/1
ADC14->CTL0 ||(ADC14_CTL0_SHP | ADC14_CTL0_ON);//AMPCON Timer,ADC ON
ADC14->CTL0 ||(ADC14_CTL0_CONSEQ_2);//ADC14_CTL0_SC,Repee-Single-Channel。
ADC14->CTL0 |= ADC14_CTL0_SHS_3;

ADC14->CTL1 = ADC14_CTL1_RES_14BIT;// Resolución DE 14Bit 16ciclos.

ADC14->MCTL[0]= ADC14_MCTLN_Inch_6 | ADC14_MCTLN_EOS;//A1输入。 Vref = AVCC
ADC14->IER0 = ADC14_IER0_IE0;//启用中断
}

void TA0_N_IRQHandler (void){

开关(TIME_A0->IV){
案例0x0E:
TIME_A0->CTL &=~TIMER_A_CTL_IFG;
timer_a0->ccr [2]=(int)(cuentas -(cuentas * d);
timer_a0->ccr [3]=(int)(cuentas * d);
中断;
默认:
中断;
}
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    爱德华多
    问题的核心似乎是计时器A0中断的发生速度快于CPU处理ISR的速度。 如果减慢时间中断,则您将有时间为两个中断提供服务。 我正在研究如何利用FPU来更快地执行计算。 下面是有关该主题的一些其他主题。

    e2e.ti.com/.../41.342万
    e2e.ti.com/.../150.3919万

    此致,
    Chris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Eduardo!

    只需快速查看-此行:

    双倍periodo = 1/frec;

    可能会导致0.0 ,因为1也被视为整数和frec(10万)。 您应该将1.0 rec/frec写入或将frec定义为10万.0。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    爱德华多

    我同意Chris的观点,我对使用浮点运算的这两行进行了评论,这两行似乎都进入了ISR的良好状态。  

    您是否在这方面取得了任何进展,或者您是否仍需要更多帮助才能使其发挥作用?

    注意:您的代码意味着msp432以48MHz运行,但由于您尚未将其设置为48MHz,因此它在默认情况下确实以3MHz运行。  我知道这不能解决您遇到的问题(我已经尝试过了),但如果  您想设置48MHz,此示例代码步骤1-3将帮助您设置。

    请告诉我此问题是否已解决,以便我们继续尝试在您需要时为您提供帮助。