【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存在一个很大的跳变值。嗯,之前分析的还是对的。
对项目的修改与使用见(下篇)。
(下篇)地址:https://bbs.eeworld.com.cn/thread-1061508-1-1.html 赛普拉斯的东西做得还是很好,特别是软件自动生产代码。
页:
[1]