DDZZ669 发表于 2018-11-27 16:52

【CY8CKIT-149 PSoC 4100S测评】+PWM分析与使用(上)

经过多天的摸索,对PSoC的编程有了一定的认识,起初我以为它的编程方法和单片机类似,但看它的源程序,怎么那么多子文件,每个使用的引脚都有单独一个c文件进行配置。
后来发现原来不需要自己手写这些文件的,都是图形化操作,主程序部分需要手动修改一下。

下面以PWM的例子来实际操作一下。
PWM这个例子有官方的例程,我们先分析一下这个程序,然后再在其基础上进行修改。
由于帖子中图片较多,分上下两个帖子来写,这个帖子先对官方的PWM项目进行分析和测试,下个帖子进行修改验证。

首先新建一个PWM例程,如下图Create New Project,跳出窗口选择默认的PSoC 4100选择,Next。


跳出如下窗口,我们选择到第一个Code example,Next。


跳出如下窗口,红色方框内是官方例程,可以看到有ADC、I2C、CapSense、UART等等,我们先选择PWM,Next。


跳出如下窗口,可以更换项目名称和保存的路径,注意要选择英文路径!!!Finish


此时工程已建好,并自动弹出一个PDF的程序说明,如下图:


我们先来分析一下这个工程,点开后缀为cysch的文件,它类似于一个原理图,可以看到有时钟、PWM、端口、LED和中断组成,如下图:


双击PWM模块,可以弹出其配置对话框,如下图。我们主要关注的是周期和占空比,即图中的Period和Compare。
这里两个值都是65535,理论上是一直高电平,下面的line显示了这一点,但是图中line有缝隙啊?大概是为了区分结束点?
line_n是输出于line电平相反的信号。


我们可以更改一下Compare的值,如下图,改为35535后,可以看到line的占空比相应的发生变化。


另外还可以改一下PWM的对齐方式,如下图,改为右对齐后的变化。


为了不影响原项目,我们先不保存我们的修改,Cancel退出!!!

我们再来看一下时钟模块,双击它,如下图,也就改改频率。


再来看一下中断模块,双击它,如下图,中断类型可以改,不过我就认识RISING_EDGE是上升沿触发。


下面我们看一下它的主程序:

/******************************************************************************
* Function Name: main
*******************************************************************************
*
* Summary:
*This function:
*1. Sets up and enables the PWM interrupt.
*2. Starts the PWM Component.
*
******************************************************************************/
int main()
{   
    /* Enable the global interrupt */
    CyGlobalIntEnable;

    /* Enable the Interrupt component connected to the PWM interrupt output */
    Isr_TC_StartEx(Isr_TC_Handler);

    /* Start the PWM Component */
    PWM_Start();

    for(;;)
    {

    }
}

可以看到主程序很简洁,开启中断,开启PWM,就进入无限循环了,主程序依然是单片机编程的思路

另外还有一个中断服务函数:

#define BRIGHTNESS_CHANGE         (200u)
/******************************************************************************
* Function Name: Isr_TC_Handler
*******************************************************************************
*
* Summary:
*Handles the Interrupt Service Routine for the PWM Component.
*
******************************************************************************/
CY_ISR(Isr_TC_Handler)
{   
   /* Clear the TC Interrupt */
   PWM_ClearInterrupt(PWM_INTR_MASK_TC);

    /* Decrement the PWM Compare value to increase the LED brightness */
    PWM_WriteCompare(PWM_ReadCompare() - BRIGHTNESS_CHANGE);
}

它大概是每65536计数值中断一次,还记的PWM模块那里的设置吗?
在中断函数里,首先清除中断标值,然后修改一下Compare的值,它应该就是占空比。

修改规则是先读入当前的Compare值,然后用这个值减去一个固定值200,也就是说每次的占空比不断减小,那减小到0呢?溢出?自动变成最大值65535?先不管这么多,反正就是每次中断都修改Compare为不同的值。

好了,项目工程基本分析完毕,我们编译和下载一下该程序,看看效果。
如下图,程序功能是使2.2口的LED逐渐变亮,然后突然熄灭,再逐渐变亮,反复循环。
现在再想一下中断程序,占空比不断减小,高电平时间不断减小(line那条输出),而2.2口的LED又是低电平点亮,正好对应着亮度不断增加。突然熄灭说明Compare存在一个很大的跳变值。嗯,之前分析的还是对的。


对项目的修改与使用见(下篇)。

DDZZ669 发表于 2018-11-28 08:43

(下篇)地址:https://bbs.eeworld.com.cn/thread-1061508-1-1.html

damiaa 发表于 2018-11-28 10:35

赛普拉斯的东西做得还是很好,特别是软件自动生产代码。
页: [1]
查看完整版本: 【CY8CKIT-149 PSoC 4100S测评】+PWM分析与使用(上)