器件型号: MSPM0C1104
尊敬的先生:
我们正在对 PWM 变化进行编码、并考虑 ADC 的变化
代码随附在下方。
已尝试使用 ADC 中断启用进行调试、计时器中断不工作。
但当我们禁用 ADC 中断时、计时器中断开始工作。
如果需要进行任何更改、请告知。
包含“ti_msp_dl_config.h"</s>“
#define PWM_PERIOD_UPDATE_CNT (10U)
const uint32_t period = 1599;
const uint32_t gDutyVal[3] ={799,499、49};
易失性 uint32_t gIndex;
易失性 uint32_t gUpdateCnt;
Volatile bool gCheckADC;
易失性 uint16_t gAdcResult;
Volatile int16_t gADCOffset;
内部 main (void)
{
SYSCFG_DL_init ();
/*获得校准后的 ADC 偏移量 — ADC_ERR_09 的权变措施*/
gADCOffset =
DL_ADC12_getADCOffsetCalibration (ADC12_0_ADCMEM_0_REF_VOLTAGE_V);
gIndex = 0;
gUpdateCnt = PWM_PERIOD_UPDATE_CNT;
NVIC_EnableIRQ (PWM_0_INST_INT_IRQN);
DL_TimerA_startCounter (PWM_0_INST);
//NVIC_EnableIRQ (ADC12_0_INST_INT_IRQN);
gCheckADC = false;
DL_GPIO_clearPins (GPIO_LEDS_PORT、GPIO_LEDS_USER_LED_1_PIN |
GPIO_LEDS_USER_TEST_PIN);
while (1)
{
DL_ADC12_startConversion (ADC12_0_INST);
while (false == gCheckADC){
__ WFE ();
}
gAdcResult = DL_ADC12_getMemResult (ADC12_0_INST、DL_ADC12_MEM_IDX_0);
/*应用校准后的 ADC 偏移 — ADC_ERR_09 的权变措施*/
int16_t adcRaw =(int16_t) gAdcResult + gADCOffset;
if (adcRaw < 0){
adcRaw = 0;
}
如果 (adcRaw > 4095){
adcRaw = 4095;
}
gAdcResult =(uint16_t) adcRaw;
// gCheckADC = false;
DL_ADC12_enableConversions (ADC12_0_INST);
//
//__ WFI ();
}
}
void PWM_0_INST_IRQHandler (void)
{
开关 (DL_TimerA_getPendingInterrupt (PWM_0_INST))
{
用例 DL_TIMERA_IIDX_CC0_DN:
if (gAdcResult > 0x00 & gAdcResult <0x64) // 0 至 100
{
gIndex = 0;
}
Else if (gAdcResult > 0x64 & gAdcResult < 0xc8) // 100 至 200
{
gIndex = 1;
}
Else if (gAdcResult > 0xc8 & gAdcResult < 0xff) // 200 至 300
{
gIndex = 2;
}
DL_TimerA_setLoadValue (PWM_0_INST、PERIOD);
DL_TimerA_setCaptureCompareValue (PWM_0_INST、gDutyVal[gIndex]、
DL_TIMERA_CAPTURE_COMPARE_0_INDEX);
gCheckADC = false;
默认值:
休息;
}
}
void ADC12_0_INST_IRQHandler (void)
{
开关 (DL_ADC12_getPendingInterrupt (ADC12_0_INST))
{
用例 DL_ADC12_IIDX_MEM0_RESULT_LOADED:
gAdcResult = DL_ADC12_getMemResult (ADC12_0_INST、DL_ADC12_MEM_IDX_0);
gCheckADC = true;
DL_ADC12_startConversion (ADC12_0_INST);
休息;
默认值:
休息;
}
}