问答

汇集网友智慧,解决技术难题

21ic问答首页 - LKS32MC08x系列时钟主频、机器周期、总线周期、指令周期计算

周期 ADC 频率 中断

LKS32MC08x系列时钟主频、机器周期、总线周期、指令周期计算

jiushao2023-05-13
        1.在pll开启且不分频的条件下,用一个io口翻转电平的方式,在主循环内测试了一下输出频率,主循环内就一句代码:“GPIO0->PDO = ~GPIO0->PDO;”。得到的输出频率大概是2mhz,和预期值相差较大,所以询问一下如题。        2。以pwm方式触发ADC中断,在ADC中断中加入翻转gpio的测试。但是降低/提高pwm的频率对ADC中断中的电平翻转频率似乎没有影响?部分代码如下:
void ADC0_init(void)
{
    ADC_InitTypeDef ADC_InitStructure;
    ADC_StructInit(&ADC_InitStructure);                          //初始化结构体
    ADC_InitStructure.IE = ADC_EOS0_IRQ_EN | ADC_DAT0_OV_IRQ_EN; //第一段扫描结束中断使能和ADC_DAT0超阈值中断
    ADC_InitStructure.Align = ADC_LEFT_ALIGN;                    //ADC数据输出左对齐
    ADC_InitStructure.UTIMER_Trigger_En = DISABLE;               //UTIMER_T0硬件触发ADC采样
    ADC_InitStructure.MCPWM_Trigger_En = ADC_MCPWM_T0_TRG;      
    ADC_InitStructure.FirSeg_Ch = ADC_2_TIMES_SAMPLE;            //第一段采样的总通道数: 1~20
    ADC_InitStructure.Trigger_Cnt = 0;                           /*单段触发模式下触发一次采样所需要的事件数:0~15 0表示需要一次触发,15表示需要16次*///修改此处似乎进入中断的频率并没有更改?
    ADC_InitStructure.Trigger_Mode = ADC_1SEG_TRG;               /*ADC采样1段模式*/
    ADC_InitStructure.DAT0_TH_Type = ENABLE;                     //设置ADC比较上阈值中断使能
    ADC0_DAT0_TH = 5000;                                         //设置ADC0_DARA0大于ADC0_DAT0_TH值时,触发ADC数值比较中断
    ADC_Init(ADC0, &ADC_InitStructure);
    ADC0_IF = 0xff;                                   //清中断标志位
    ADC0_GAIN0 = 0x0;                                 //开启2/3增益
    ADC0_CHN0 = ADC_CHANNEL_7 | (ADC_CHANNEL_16 << 8); //采样通道通道
}

void MCPWM_init(void)
{
    MCPWM_InitTypeDef MCPWM_InitStructure;
    MCPWM_StructInit(&MCPWM_InitStructure);
    MCPWM_InitStructure.CLK_DIV = PWM_PRSC;                /* MCPWM时钟分频设置 */
    MCPWM_InitStructure.MCLK_EN = ENABLE;                  /* 模块时钟开启 */
    MCPWM_InitStructure.MCPWM_Cnt_EN = ENABLE;             /* 主计数器开始计数使能开关 */
    MCPWM_InitStructure.MCPWM_WorkModeCH0 = CENTRAL_PWM_MODE; /* MCPWM CH0工作模式:边沿对齐PWM模式 */
    MCPWM_InitStructure.GPIO_BKIN_Filter = 0; /* 急停事件(来自IO口信号)数字滤波器时间设置 */
    MCPWM_InitStructure.CMP_BKIN_Filter = 0;  /* 急停事件(来自比较器信号)数字滤波器时间设置 */
    MCPWM_InitStructure.MCPWM_PERIOD = PWM_PERIOD;              /* 计数周期设置即MCPWM输出周期*/
    MCPWM_InitStructure.TriggerPoint0 = (u16)(-PWM_PERIOD); /* MCPWM_TMR0 ADC触发事件T0 设置 */

。。。
}
void ADC0_IRQHandler(void)
{
        if (ADC0_IF & BIT0) //判断是否发生第一采样完成中断
        {
                ADC0_IF = BIT0; //清除第一段采样完成中断标志位
        }
        if (ADC0_IF & BIT6)
        {
                ADC0_IF = BIT6; //清除ADC0_DAT0超阈值中断
        }
        GPIO0->PDO = ~GPIO0->PDO;
}


回答 +关注 14
1633人浏览 0人回答问题 分享 举报
0 个回答

您需要登录后才可以回复 登录 | 注册