怎样看网站的浏览量,开发软件需要什么条件,电子商务网站建设的核心是,可以在线制作简历的网站PWM
-PWM介绍 PWM#xff08;pulse Width Modulation#xff09;简称脉宽调制#xff0c;是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术#xff0c;广泛应用在测量#xff0c;通信#xff0c;工控等方面 PWM的频率 是指在1秒钟内#xff0c;信号从…PWM
-PWM介绍 PWMpulse Width Modulation简称脉宽调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术广泛应用在测量通信工控等方面 PWM的频率 是指在1秒钟内信号从高电平到低电平在回到高电平的次数也就是说1秒钟PWM有多少个周期单位HZ PWM的周期 T1/fT是周期f是频率即如果频率为50HZ也就是说一个周期是20ms那么1秒钟就有50个PWM周期 占空比 是一个脉冲周期内高电平的时间与整个周期时间的比例0%~100% 总结 1.脉冲周期T单位是时间比如纳秒ns微秒us毫秒ms等 2.脉冲频率f单位是HZKHZ等与脉冲周期成倒数关系f1/T 3.脉冲宽度W简称“脉宽”是脉冲高电平持续的时间单位是时间 4.占空比D脉宽除以脉冲周期的值百分比表示比如50%也常有小数或分数表示的比如0.5或1/2 以上之间的关系如图所列的公式 -PWM的工作原理分析IMX6ull 脉宽调制PWM有一个16位计数器经过优化可以从存储的样本音频图像中生成声音还可以生成音调它使用16位分辨率指的就是16位计数器4 x 16数据FIF0[缓存] 工作原理 PWM的输出是一个切换信号其频率和占空比可以通过编程相应的寄存器来调制它有一个16位向上计数器从0x0000开始计数直到计数器值等于PWM_PR1,匹配发生后计数器重置为0x0000PWM_PR是周期寄存器 在计数周期的开始PWM0引脚设置为1默认计数器从0x0000开始向上计数采样值在采样FIF0中它的值在每个时钟周期和计数器的值比较当采样值和计数器匹配时PWM0信号被清除为0默认计数器继续计数直到周期匹配发生随后另一个周期开始 当PWM被启用时计数器开始运行并使用周期和采样寄存器中的重置值生成输出建议在启用PWM之前完成这些寄存器的编程 硬件复位导致所有PWM计数和采样寄存器被清除FIF0被刷新控制寄存器显示FIF0为空可以写入PWM被禁用软件复位具有相同的结果但是控制寄存器中DBGEN,STOPEN,DOZEN和WAITEN位的状态不受影响只有PWM处于禁用状态才可以进行软件复位
FIF0 数字采样值可以作为16位字加载到脉冲调制器中可以使用控制器的BCTR和HCTR位来改变字节序4字16位FIF0最大限度地减少了中断开销。当数据字的数量低于控制寄存器的FWM字段设置的水位时会产生可屏蔽中断。 如果FIF0未满对PWM_SAR采样寄存器的写入会导致该值被存储到FIF0中FIF0已满时的写入会设置状态寄存器中的FWEFIF0写入错误位并且FIF0内容保持不变FIF0可以随时写入但只有在启用PWM时才能读取PWM_SR[FIF0AV]字段显示FIF0中当前包含多少数据字以及是否可以写入 -PWM重点寄存器介绍
PWM Control Register (PWMx_PWMCR) PWM Counter Register (PWMx_PWMCNR) 只读脉冲宽度调制器计数器寄存器PWM_PWMCNR包含当前计数值可以随时读取而不会干扰计数器 PWM Period RegisterPWMx_PWMPR PWM周期寄存器PWM_PWMPR确定PWM输出信号的周期计时器值匹配PERIOD1后计数器复位以开始另一个周期PWMO[Hz] PLCK[Hz]/period2
(由于写入PWM_PWMPR导致的周期值的变化会导致计数器重置为零并开始新的计数周期) PWM Sample RegisterPWMx_PWMSAR PWM采样寄存器PWM_PWMSAR是FIF0的输入16位字被加载带FIF0的输入。FIF0可以随时写入但只有启用PWM时才能读取 -PWM驱动蜂鸣器
原理图分析 原理图通过GPIO_9这个IO来控制蜂鸣器当GPIO_9输出低电平的时蜂鸣器发声。设置GPIO1_9的MUX mod为PWM的工作模式不同的占宽比让蜂鸣器发出的响声不一样 编程思路
1.使能GPIO和PWM时钟信号
2.管脚设置为PWM功能模式
3.复位PWM控制器
4.选择时钟信号确定PWM的输入时钟信号
5.设置PWM周期值和采样值
6.开启PWM然后延时一段时间最后关闭PWM 示例代码
pwm.c
#include pwm.hvoid pwm_gpio_init(){//开启时钟CCM_CCGR1 | (0x3 26);// 设置复用器IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO09 ~(0xf0);//设置方向GPIO1-GDIR | (0x19);
}//pwm的初始化
void pwm_init(){//开启时钟CCM-CCGR4 | (0x3 18);//禁用PWMPWM2-PWMCR ~(0x1 0);//软件复位PWM2-PWMCR | (0x13);while (PWM2-PWMCR (0x1 3)){}//选择时钟源PWM2-PWMCR ~(0x316);PWM2-PWMCR | (0x1 16);// 设置pwm的时钟分频器PWM2-PWMCR ~(0xfff 4);PWM2-PWMCR | (0x41 4);//设置周期PWM2-PWMPR PERIOD - 2;
}//打开PWM
void pwm_on(){// 使能pwmPWM2-PWMCR | (0x1 0);
}//关闭PWM
void pwm_off(){// 关闭pwmPWM2-PWMCR ~(0x1 0);
}// 设置采样值
void pwm_set_sample_val(int val){PWM2-PWMSAR val;
}//测试
void pwm_test(){pwm_gpio_init();pwm_init();pwm_on();int i0;for(;i10;i){pwm_set_sample_val(i*100);gpt_delay_mseconds(500);}pwm_off();
}
pwm.h
#ifndef __PWM_HEAD_
#define __PWM_HEAD_#include ../../include/imx6ull.h
#include ../driver/gpt/gpt.h
#include stdio.h #define PERIOD 1000extern void pwm_test();
#endif