/**
 * @brief ADC-MCPWM触发ADC采样内部温度传感器
 * @details 使用MCPWM触发ADC1采样温度传感器并计算温度
 */
#include "lks32mc09x_lib.h"
void MCPWM_Config(void);
volatile int32_t tmp = 0;
/**
 * @brief 主函数
 */
int main(void)
{
    MCPWM_Config();
    ADC_InitTypeDef ADC_InitStruct;

    // 初始化ADC结构体
    ADC_StructInit(&ADC_InitStruct);

    // 配置ADC参数
    ADC_InitStruct.IE = ADC_IE_SF1;           // 禁用中断
    ADC_InitStruct.RE = 0;                    // 禁用DMA请求
    ADC_InitStruct.NSMP = 0;                  // 禁用两段采样
    ADC_InitStruct.DATA_ALIGN = 0;            // 右对齐
    ADC_InitStruct.CSMP = 0;                  // 禁用连续采样
    ADC_InitStruct.TCNT = 0;                  // 触发一次采样
    ADC_InitStruct.TROVS = 0;                 // 禁用过采样
    ADC_InitStruct.OVSR = 0;                  // 过采样率
    ADC_InitStruct.TRIG = ADC_TRIG_MCPWM0_T0; // MCPWM0 T0 事件触发 ADC 常规采样
    ADC_InitStruct.S1 = 1;                    // 第一段常规采样次数
    ADC_InitStruct.S2 = 0;                    // 第二段常规采样次数
    ADC_InitStruct.IS1 = 0;                   // 空闲采样次数
    ADC_InitStruct.GAIN = ADC_GAIN_3V6;       // 3.6V量程
    ADC_InitStruct.LTH = 0;                   // 禁用模拟看门狗
    ADC_InitStruct.HTH = 0xFFFF;              // 禁用模拟看门狗
    ADC_InitStruct.GEN = 0;                   // 禁用模拟看门狗
    ADC_InitStruct.IDLE_PRI = 0;

    ADC_Init(ADC1, &ADC_InitStruct);
    ADC_SetChn(ADC1, ADC_DAT_0, ADC1_CHN_TMP);
    TMP_Init();
    NVIC_EnableIRQ(ADC1_IRQn);
    __enable_irq();
    while (1)
    {
    }
}
void ADC1_IRQHandler()
{
    ADC_ClearIRQFlag(ADC1, ADC_IF_SF1);
    tmp = TMP_GetCurrentTemperature(ADC_GetConversionValue(ADC1, ADC_DAT_0)); // 将ADC采样值转换为温度值并保存到全局变量CurrentTempature中
}
/**
 * @brief 配置MCPWM输出三路中心对称的PWM，频率20kHz。
 */
void MCPWM_Config(void)
{
    MCPWM_InitTypeDef MCPWM_InitStruct;

    // 初始化MCPWM结构体
    MCPWM_StructInit(&MCPWM_InitStruct);

    // 配置MCPWM基本项
    MCPWM_InitStruct.EN = 1;                    // 使能MCPWM模块
    MCPWM_InitStruct.CLK_DIV = MCPWM_CLK_DIV_1; // 时钟1分频
    MCPWM_InitStruct.TH = 4000;
    MCPWM_InitStruct.TR = MCPWM_TR_T0; // 计数器溢出时刻触发自动更新

    // 配置死区时间
    MCPWM_InitStruct.DTHP = 0; // 上管死区时间
    MCPWM_InitStruct.DTHN = 0; // 下管死区时间

    // 配置IO输出
    MCPWM_InitStruct.IO0 = MCPWM_IO_HL_PWM;  // CH0: 上管高有效，下管低有效，正常输出PWM
    MCPWM_InitStruct.IO1 = MCPWM_IO_HL_PWM;  // CH1: 上管高有效，下管低有效，正常输出PWM
    MCPWM_InitStruct.IO2 = MCPWM_IO_HL_PWM;  // CH2: 上管高有效，下管低有效，正常输出PWM
    MCPWM_InitStruct.IO3 = MCPWM_IO_DISABLE; // CH3: 不使用
    MCPWM_InitStruct.FAIL_IO = MCPWM_FAIL_IO_OFF;

    // 配置自动更新使能
    MCPWM_InitStruct.AUEN = MCPWM_AUEN_DEFAULT; // 使能TH0自动加载

    // 配置中断和DMA（本例程中不使用中断和DMA）
    MCPWM_InitStruct.IE = MCPWM_IE_TMR3;
    MCPWM_InitStruct.EIE = 0;
    MCPWM_InitStruct.RE = 0;

    // 初始化MCPWM模块
    MCPWM_Init(MCPWM0, &MCPWM_InitStruct);

    // 设置输出状态
    MCPWM_SetOutputState(MCPWM0, 1);

    // 设置PWM输出值，中心对齐模式下占空比50%
    MCPWM_SetOutputVal(MCPWM0, 0, -1000, 1000); // CH0: 中心对齐，占空比50%
    MCPWM_SetOutputVal(MCPWM0, 1, -1000, 1000); // CH1: 中心对齐，占空比50%
    MCPWM_SetOutputVal(MCPWM0, 2, -1000, 1000); // CH2: 中心对齐，占空比50%

    // 开始计数

    MCPWM_SetTMR(MCPWM0, 0, 0, 1000, 3900);

    MCPWM_StartCount(MCPWM0);
    MCPWM0_UPDATE = 0xffffffff;
}
