查看: 5079|回复: 12

[已解决] ke02芯片FTM2设置与ADC设置为啥有冲突?

[复制链接]

该用户从未签到

6

主题

19

帖子

0

注册会员

Rank: 2

积分
86
最后登录
2018-3-26
发表于 2016-10-22 15:39:23 | 显示全部楼层 |阅读模式
如题,我想用FTM2CH5产生PWM波,然后用ADC0_SE11采集电压,程序中FTM及ADC模块设置如下:
/*设置ADC模块*/
ADC_ConfigType  sADC_Config = {0};
    sADC_Config.u8ClockDiv = ADC_ADIV_DIVIDE_4;
    sADC_Config.u8ClockSource = CLOCK_SOURCE_BUS_CLOCK;
    sADC_Config.u8Mode = ADC_MODE_12BIT;
    sADC_Config.sSetting.bIntEn = 1;
    sADC_Config.u8FiFoLevel = ADC_FIFO_LEVEL2;
    ADC_SetCallBack(ADC_CallBack);
    ADC_Init( ADC, &sADC_Config);
ADC_SetChannel(ADC,ADC_CHANNEL_AD11);
ADC_SetChannel(ADC,ADC_CHANNEL_AD22_TEMPSENSOR);

/*设置PWM波*/
    FTM_PWMInit(FTM2, FTM_PWMMODE_EDGEALLIGNED, FTM_PWM_HIGHTRUEPULSE);
    /* FTMEN enable */
    FTM_SetFTMEnhanced(FTM2);
    /* update MOD value */
    FTM_SetModValue(FTM2, 15999);
    /* set clock source, start counter */
    FTM_ClockSet(FTM2, FTM_CLOCK_SYSTEMCLOCK, FTM_CLOCK_PS_DIV1);  
    /* enable FTM2 interrupt in NVIC */
    NVIC_EnableIRQ(FTM2_IRQn);
    /* setup call back function for interrupt */
    FTM_SetCallback(FTM2, FTM2_Task);
    /* enable FTM2 overflow interrupt */
    FTM_EnableOverflowInt(FTM2);
FTM_ClrOverFlowFlag(FTM2);
u16ChV_new = 8000;
FTM_SetChannelValue(FTM2, FTM_CHANNEL_CHANNEL5, u16ChV_new);

这样设置后FTM2CH5可以出PWM波,但是同时ADC0_SE11也会输出PWM波(这个引脚功能是复用的,可以用作ADC0_SE11也可用作FTM2_CH3),但这个PWM波跟通道5的PWM波周期不同,同时AD也能读到这个PWM波的值,这是为什么?哪位大神能帮我解答一下?不胜感激!

最佳答案

liqing666 发表于 2016-10-25 19:39 还想请教一下,就是关于ADC转换的问题,我现在同时开启了3个通道如下: ADC_SetChannel(ADC,ADC_CHANNEL_ ... 楼主你好! 请请参考官方的FIFO ADC例程,如果你同时转换3个通道, ...
回复

使用道具 举报

  • TA的每日心情
    开心
    2017-2-13 07:08
  • 签到天数: 18 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    1

    主题

    264

    帖子

    0

    高级会员

    Rank: 4

    积分
    596
    最后登录
    2017-8-24
    发表于 2016-10-22 23:31:51 | 显示全部楼层
    先copy看看,后回复你。
    来签到,来签到,早上好!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24858
    最后登录
    2025-7-17
    发表于 2016-10-24 10:47:37 | 显示全部楼层
    楼主你好!
    这个应该和FTM的配置有关,你查看下:FTM_PWMInit
    我记得官方的代码中把所有的通道都配置为PWM了,你看看你那边代码,FTM的初始化里面,是不是也有把所有通道都配置的代码,如果有,你把相关代码去掉,只保留你自己需要的FTM2_CH5就可以了。
    官方是这样的:
        if(FTM_PWM_HIGHTRUEPULSE == u8PWMEdgeSelect)
        {
            /* Configure timers PWM High True Pulses */
            for(i=0; i<channels; i++)
            {
                pFTM->CONTROLS[i].CnSC = FTM_CnSC_MSB_MASK | FTM_CnSC_ELSB_MASK;  
                pFTM->CONTROLS[i].CnV  = FTM_C0V_INIT + i*100;
            }
        }
        else if(FTM_PWM_LOWTRUEPULSE == u8PWMEdgeSelect)
        {
            /* Configure timers for PWM Low True Pulses */
            for(i=0; i<channels; i++)
            {
                pFTM->CONTROLS[i].CnSC = FTM_CnSC_MSB_MASK | FTM_CnSC_ELSA_MASK;
                pFTM->CONTROLS[i].CnV  = FTM_C0V_INIT + i*100 ;
            }
        }  
    你看看,里面有所有通道的配置。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    6

    主题

    19

    帖子

    0

    注册会员

    Rank: 2

    积分
    86
    最后登录
    2018-3-26
     楼主| 发表于 2016-10-25 14:26:03 | 显示全部楼层
    好的,我试一下看看!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    6

    主题

    19

    帖子

    0

    注册会员

    Rank: 2

    积分
    86
    最后登录
    2018-3-26
     楼主| 发表于 2016-10-25 14:42:32 | 显示全部楼层
    小恩GG 发表于 2016-10-24 10:47
    楼主你好!
    这个应该和FTM的配置有关,你查看下:FTM_PWMInit
    我记得官方的代码中把所有的通道都配置为PWM ...

    好像是这个样子!谢谢了!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24858
    最后登录
    2025-7-17
    发表于 2016-10-25 17:33:43 | 显示全部楼层
    liqing666 发表于 2016-10-25 14:42
    好像是这个样子!谢谢了!

    很大程度上是这个,之前我们也遇到过这个问题,关闭相应的FTM通道就ok了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24858
    最后登录
    2025-7-17
    发表于 2016-10-25 17:33:50 | 显示全部楼层
    liqing666 发表于 2016-10-25 14:42
    好像是这个样子!谢谢了!

    很大程度上是这个,之前我们也遇到过这个问题,关闭相应的FTM通道就ok了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24858
    最后登录
    2025-7-17
    发表于 2016-10-25 17:33:53 | 显示全部楼层
    liqing666 发表于 2016-10-25 14:42
    好像是这个样子!谢谢了!

    很大程度上是这个,之前我们也遇到过这个问题,关闭相应的FTM通道就ok了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    6

    主题

    19

    帖子

    0

    注册会员

    Rank: 2

    积分
    86
    最后登录
    2018-3-26
     楼主| 发表于 2016-10-25 19:39:27 | 显示全部楼层
    小恩GG 发表于 2016-10-25 17:33
    很大程度上是这个,之前我们也遇到过这个问题,关闭相应的FTM通道就ok了。 ...

    还想请教一下,就是关于ADC转换的问题,我现在同时开启了3个通道如下:
    ADC_SetChannel(ADC,ADC_CHANNEL_AD11);
    ADC_SetChannel(ADC,ADC_CHANNEL_AD9);
    ADC_SetChannel(ADC,ADC_CHANNEL_AD22_TEMPSENSOR);
    然后把读出来的数据存放如下:
    while( !ADC_IsFIFOEmptyFlag(ADC) )
        {
            if( u16ADC_ConversionCount < 16)
            {
                u16ADC_ConversionBuff[u16ADC_ConversionCount++] = ADC_ReadResultReg(ADC);
            }
            else
            {
                ADC_ReadResultReg(ADC);
            }
        }
    为什么调试的时候看转换数组里的数据一直在跳呢,比如u16ADC_ConversionBuff【1】有时候为0,有时候又有数据,而且三路ADC对应的不应该是三个数据吗?为什么u16ADC_ConversionBuff从第一位到第五位都有数据?顺便问一下如果同时开启三路ADC,那么它们转换的结果是不是都放在同一个结果寄存器中呢?如果是,我应该怎么把它们分别提取出来呢?求解
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24858
    最后登录
    2025-7-17
    发表于 2016-10-26 09:58:00 | 显示全部楼层
    liqing666 发表于 2016-10-25 19:39
    还想请教一下,就是关于ADC转换的问题,我现在同时开启了3个通道如下:
    ADC_SetChannel(ADC,ADC_CHANNEL_ ...

    楼主你好!
    请请参考官方的FIFO ADC例程,如果你同时转换3个通道,那么请使能3级FIFO。
    否则你的数据会错乱的。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-18 15:00 , Processed in 0.107230 second(s), 31 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表