打印
[KungFu32位 MCU]

芯旺微chipon KF32A156系列ccp模块用于输出 pwm 的基本使用

[复制链接]
3646|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2024-4-1 17:11 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
芯旺微chipon KF32A156系列 CCP 模块的基本使用
在数据手册上可以看到引脚具备CCPxCHy等功能映射,如下图。



这些是capture、compara、pwm的首字母缩写。其中CCPx是以定时器为时基,CHy就是通道。通常一个通用定时器下的CCP模块是可以有4个通道,就PWM而言,这4个通道可以配置成频率相同,占空比不同的通道,支持中心对齐和边沿对齐。

下面我们以 PH1和PD14为例来进行配置 :
配置步骤如下:
1、首先查询数据手册可知:PH1可以配置为CCP1CH2,PD14可以配置为CCP1CH1,图中可以看到其实这两个脚也可以配置为其他通道的用来输出PWM,我们这里就都是用Timer1,也同时为了演示一个定时器如何配置多个通道。



小提示:配置流程三步走又来了:
2、老规矩, 第一步配置引脚 。既然引脚要配置功能,那就离不开重映射配置,先把引脚重映射功能根据数据手册指示的重映射通道来配置,程序如下:

        GPIO_Write_Mode_Bits (GPIOH_SFR,GPIO_PIN_MASK_1, GPIO_MODE_RMP);      //预期输出20KHZ

        GPIO_Write_Mode_Bits (GPIOD_SFR,GPIO_PIN_MASK_14, GPIO_MODE_RMP);     //预期输出20KHZ

        GPIO_Pin_RMP_Config(GPIOH_SFR,GPIO_Pin_Num_1, GPIO_RMP_AF10);     //CCP1CH2

        GPIO_Pin_RMP_Config(GPIOD_SFR,GPIO_Pin_Num_14, GPIO_RMP_AF2);     //CCP1CH1



3、配置外设本身,那么PWM设计到的外设,一个是定时器,还有一个是CCP模块,定时器设置和频率相关,CCP模块可以配置有哪些通道打开,占空比多少,pwm输出方式等等。看下面的程序配置

TIM_Reset(CCP1_SFR);

                /* CCP 's PWM function channel mode */
                CCP_PWM_Mode_Config(CCP1_SFR, CCP_CHANNEL_1, CCP_PWM_MODE);  //配置t1通道1为pwm模式
                CCP_PWM_Mode_Config(CCP1_SFR, CCP_CHANNEL_2, CCP_PWM_MODE);//配置t1通道2为pwm模式

                /* Configure CCP channel output to control PWM output, high effective */
                CCP_Channel_Output_Control(CCP1_SFR, CCP_CHANNEL_1, CCP_CHANNEL_OUTPUT_PWM_INACTIVE); //配置通道1对齐方式,可自行查询其他方式
                CCP_Channel_Output_Control(CCP1_SFR, CCP_CHANNEL_2, CCP_CHANNEL_OUTPUT_PWM_INACTIVE); //配置通道2对齐方式,可自行查询其他方式
                /* PWM duty cycle */
                CCP_Set_Compare_Result(CCP1_SFR, CCP_CHANNEL_1, 6001);  //设置占空比
                CCP_Set_Compare_Result(CCP1_SFR, CCP_CHANNEL_2, 6001);  //设置占空比


                /* Timing mode selection */
                GPTIM_Work_Mode_Config(CCP1_SFR, GPTIM_TIMER_MODE);
                /* Timer count value */
                GPTIM_Set_Counter(CCP1_SFR, 0);
                /* Timer period value */
                GPTIM_Set_Period(CCP1_SFR, 6000);
                /* Timer prescaler value */
                GPTIM_Set_Prescaler(CCP1_SFR, 0);

        #if 1
                /* Up-counting mode, that is, edge-aligned PWM signal */   
                GPTIM_Counter_Mode_Config(CCP1_SFR, GPTIM_COUNT_UP_OF);    //边沿对齐的定时器计数模式设置
        #else
                /* Up and down counting mode, that is, center-aligned PWM signal */
                GPTIM_Counter_Mode_Config(CCP1_SFR, GPTIM_COUNT_UP_DOWN_OF); //中心对齐的定时器计数模式设置
        #endif
            /* Configure working clock */
                GPTIM_Clock_Config(CCP1_SFR, GPTIM_SCLK);
                GPTIM_Updata_Immediately_Config(CCP1_SFR, TRUE);
                GPTIM_Updata_Enable(CCP1_SFR, TRUE);
                GPTIM_Updata_Immediately_Config(CCP1_SFR, FALSE);
            /* Enable timer */
                GPTIM_Cmd(CCP1_SFR, TRUE);



4、配置中断,由于pwm一般无需开中断,这里就不说明中断配置了,如果有特殊需求,可以自行开启对应的中断。一般使用ccp的capture或者compara的功能会使用到中断。

这里再补充一下第5点:因为PWM在使用过程大多是需要进行占空比的调整,这里说明一下,同一个定时器的4个通道频率是一致的,如果更改则全部更改。占空比可以各个通道独立配置。下面即给出在pwm输出的过程中去修改占空比的方式:

CCP_Set_Compare_Result(CCP1_SFR, CCP_CHANNEL_1, i);   //修改t1通道1 的占空比值为i
CCP_Set_Compare_Result(CCP1_SFR, CCP_CHANNEL_2, i);    //修改t1通道2的占空比值为i


这种方式为下一个周期修改占空比,因为我们在配置定时器的时候更新方式已经配置为了下一个周期更新寄存器值到定时器内部,这也是很多工程师需求的方式。

还有一种修改方式就是当我把占空比值填充进去后立即进行修改,这样会导致当前这个周期没跑完就进行了下一个周期,这种需求不多,这里就不细说了,文字描述一下就是填充完毕后立即进行更新即可实现。

好啦,关于ccp输出pwm的方式就是以上这些啦。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/Fanshijun1/article/details/133177656

使用特权

评论回复
沙发
caigang13| | 2024-4-2 08:06 | 只看该作者
比较器输出PWM很有用

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2028

主题

15903

帖子

14

粉丝