下午开始要去看pos终端规范了~~学习笔记就先写到这。 改天补上~
PWM是一种对模拟信号电平进行数字化编码的方法,可以通过调整方波的占空比来对模拟信号电平进行编码,通常使用在开关电源(switching power)和电机控制中。
Stellaris® PWM模块由 3个 PWM发生器模块 1个控制模块组成。每个 PWM发生器模块包含1个定时器(16位递减或先递增后递减计数器),2个PWM比较器,PWM信号发生器,死区发生器和中断/ADC-触发 选择器。而控制模块决定了PWM信号的极性,以及将哪个信号传递到管脚。
下图为PWM模块结构图
当讨论到一个 PWM 模块的各种部件时,这个 API 使用了下列标号约定:
3 个发生器模块称为 Gen0、Gen1 和 Gen2。
与每个发生器模块相关的 2 个 PWM 输出信号称为 OutA 和 OutB。
6 个输出信号称为 PWM0、PWM1、PWM2、PWM3、PWM4和 PWM5。
PWM0 和 PWM1 对应 Gen0、PWM2和 PWM3 对应 Gen1、PWM4 和 PWM5 对应 Gen2。
而且,作为对这个 API 的一个简化的假设,每个发生器模块的比较器 A 专门用来调整偶数编号的 PWM 输出(PWM0、PWM2 和 PWM4)的脉宽。另外,比较器 B 专门用于奇数编号的 PWM 输出(PWM1、PWM3和 PWM5) 。
附上代码:
int main (void)
{
jtagWait();
SysCtlClockSet(SYSCTL_SYSDIV_1 | /* 配置6MHz外部晶振作为主时钟 */
SYSCTL_USE_OSC |
SYSCTL_OSC_MAIN |
SYSCTL_XTAL_6MHZ);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); /* 使能PWM2和PWM3输出所在GPIO */
SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM); /* 使能PWM模块 */
SysCtlPWMClockSet(SYSCTL_PWMDIV_1); /* PWM时钟配置:不分频 */
GPIOPinTypePWM(GPIO_PORTB_BASE, /* PB0和PB1配置为PWM功能 */
GPIO_PIN_0 | GPIO_PIN_1);
PWMGenConfigure(PWM_BASE, PWM_GEN_1, /* 配置PWM发生器1:加减计数 */
PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);
PWMGenPeriodSet(PWM_BASE, PWM_GEN_1, 60000); /* 设置PWM发生器1的周期 */
PWMPulseWidthSet(PWM_BASE, PWM_OUT_2, 3000); /* 设置PWM2输出的脉冲宽度 */
PWMPulseWidthSet(PWM_BASE, PWM_OUT_3, 3000); /* 设置PWM3输出的脉冲宽度 */
PWMOutputState(PWM_BASE, /* 使能PWM2和PWM3的输出 */
PWM_OUT_2_BIT | PWM_OUT_3_BIT,
true);
PWMGenEnable(PWM_BASE, PWM_GEN_1); /* 使能PWM发生器1,开始产生 */
/* PWM方波 */
PWMGenIntTrigEnable(PWM_BASE, /* 使能PWM发生器1归零触发中断 */
PWM_GEN_1,
PWM_INT_CNT_ZERO);
PWMIntEnable(PWM_BASE, PWM_GEN_1); /* 使能PWM发生器1中断 */
IntEnable(INT_PWM1); /* 使能PWM1中断 */
IntMasterEnable(); /* 使能总中断 */
for (;;) {
}
}
这个例程是拿L5、L6对应的PWM2、PWM3来说明的
1、显然我们应该使能外设。GPIO B 和PWM(在这之前主时钟设置)
2、PWM时钟设置(由系统时钟分频得到)
3、PB0和PB1设置成PWM类型
4、PWMGenConfigure()PWN发生器模式配置(PWM2和 PWM3 对应 Gen1),设置发生器周期。
5、设置输出信号脉宽,使能输出
6、使能发生器,开始产生方波
7、使能PWM1发生器中断
8、PWM1使能中断