一.前言
我们预计会实现一个通过旋转变压器控制蜂鸣器播放音乐,模拟”打碟器”的效果。这一篇先进行需要用到的接口ADC和PWM的测试。
二.ADC采集输出测试
本MCU支持1个多达18 通道、12 位 250 Ksps的 SAR ADC,可选硬件触发 器(ADC) 。
基于Demo,AC7802x开发板资料包\AC7802X\AC7802X\例程下载\AC7802x_Demo_V1.0.0\ADC\SampleCode\01_ADC_Regulargroup_SoftwareTriger\demo.uvprojx的Demo进行测试。
编译下载运行,USB转串口线接J3,串口参数115200-8-n-1。
调整旋转变压器可以看到,采样值变化。
由于没有模拟信号源就不测试奇精度了。
三.PWM输出测试
在上面ADC的Demo基础上进行。
从PWM的Demo下复制pwm.c和pwm.h到本工程下
修改PWM1_OutputIndependent_Init为参数可设置频率,占空比
void PWM1_OutputIndependent_Init(uint32_t freq, uint8_t duty);
复制
void PWM1_OutputIndependent_Init(uint32_t freq, uint8_t duty)
{
PWM_ConfigType config;
PWM_ModulationConfigType pwmConfig;
PWM_IndependentChConfig independentChConfig[2];
memset(&config, 0U, sizeof(config));
memset(&pwmConfig, 0U, sizeof(pwmConfig));
memset(&independentChConfig, 0U, sizeof(independentChConfig));
GPIO_SetFunc(GPIOB, GPIO_PIN0, GPIO_FUN2); /* PB0--PWM1_CH1.该引脚只在32pin封装上有 */
GPIO_SetFunc(GPIOB, GPIO_PIN1, GPIO_FUN2); /* PB1--PWM1_CH0,该引脚只在32pin封装上有.*/
/*
边沿对齐PWM模式:
周期=(MCVR-CNTIN+1)*PWM计数器时钟周期
脉宽=(CHnV-CNTIN+1)*PWM计数器时钟周期
中心对齐PWM模式:
周期=2*(MCVR-CNTIN)*PWM计数器时钟周期
脉宽=2*(CHnV-CNTIN)*PWM计数器时钟周期
*/
independentChConfig[0].channel = PWM_CH_0; /*独立输出通道选择 */
independentChConfig[0].chValue = (160000ul*duty/freq) - 1; /*通道channel值,决定占空比,输出占空比 = chValue+1/config.maxValue+1 = 3200/16000= 20%*/
independentChConfig[0].levelMode = PWM_HIGH_TRUE; /*输出PWM高有效,可配置高有效或低有效 */
independentChConfig[0].polarity = PWM_OUTPUT_POLARITY_ACTIVE_HIGH; /*通道输出极性配置为高有效,PWM Mask后输出为低电平 */
independentChConfig[0].interruptEn = ENABLE; /*通道匹配中断使能位 */
independentChConfig[0].initLevel = PWM_LOW_LEVEL; /*通道初始电平输出配置,该配置受initChOutputEn控制,决定PMM计数器未工作前PWM口的输出电平 */
independentChConfig[0].triggerEn = DISABLE; /*通道匹配触发使能位,在通道值匹配时可产生触发信号用于其他模块的触发信号 */
independentChConfig[1].channel = PWM_CH_1; /*独立输出通道选择 */
independentChConfig[1].chValue = (160000ul*duty/freq) - 1; /*通道channel值,决定占空比,输出占空比 = chValue+1/config.maxValue+1 = 800/16000 = 50% */
independentChConfig[1].levelMode = PWM_HIGH_TRUE; /*输出PWM高有效,可配置高有效或低有效 */
independentChConfig[1].polarity = PWM_OUTPUT_POLARITY_ACTIVE_HIGH; /*通道输出极性配置为高有效,PWM Mask后输出为低电平 */
independentChConfig[1].interruptEn = ENABLE; /*通道匹配中断使能位 */
independentChConfig[1].initLevel = PWM_LOW_LEVEL; /*通道初始电平输出配置,该配置受initChOutputEn控制,决定PMM计数器未工作前PWM口的输出电平 */
independentChConfig[1].triggerEn = DISABLE; /*通道匹配触发使能位,在通道值匹配时可产生触发信号用于其他模块的触发信号 */
pwmConfig.countMode = PWM_UP_COUNT; /*PWM计数器模式,PWM_UP_COUNT--向上计数模式;PWM_UP_DOWN_COUNT-- 向上/向下计数模式 */
pwmConfig.independentChannelNum = 2; /*独立通道数目*/
pwmConfig.combineChannelNum = 0; /*组合通道对数 */
pwmConfig.independentChConfig = independentChConfig; /*独立通道配置赋值 */
pwmConfig.combineChConfig = NULL; /*组合通道配置赋值 */
pwmConfig.deadtime = 0; /*死区时间值,死区功能仅在组合模式下有效 */
pwmConfig.deadtimePsc = PWM_DEADTIME_DIVID_1; /*死区时间时钟分频系数,死区功能仅在组合模式下有效 */
pwmConfig.initChOutputEn = ENABLE; /*初始化通道输出使能位,使能后独立PWM模式的 initLevel 和组合模式的ch1stInitLevel和ch2ndInitLevel配置才会生效*/
pwmConfig.initTriggerEn = DISABLE; /*PWM初始值触发使能位 */
/*
向上计数模式下,频率计算为:
freq = pwm_clk/(maxValue - initValue +1))
16000000/(16000-1+1) = 1K
*/
config.mode = PWM_MODE_MODULATION; /*PWM模式配置,PWM_MODE_MODULATION--PWM调制模式 */
config.initModeStruct = &pwmConfig; /*不同模式相应初始化配置结构体赋值 */
config.clkSource = PWM_CLK_SOURCE_APB; /*PWM时钟源选择 */
config.clkPsc = 0; /*时钟分频系数 */
config.initValue = 0; /*初始计数值 */
config.maxValue = 16000000ul/freq - 1; /*最大计数值,决定输出波形频率 */
config.overflowInterrupEn = ENABLE; /*溢出中断使能位 */
config.cntOverflowFreq = 0; /*溢出中断产生的频率与计数器频率的关系,0表示每次计数器溢出都产生中断,1表示间隔一次,以此类推 */
config.interruptEn = ENABLE; /*PWM总中断使能位 */
config.callBack = PWM1_Callback; /*中断回调函数 */
PWM_Init(PWM1, &config);
}
测试
配置为50%占空比 2K频率
PWM1_OutputIndependent_Init(2000,50);
使用示波器查看,可以看到频率误差只有0.01/2=0.5%
PWM1_OutputIndependent_Init(2000,10);
PWM1_OutputIndependent_Init(2000,90);
四.总结
通过以上测试可以看出PWM输出精度是非常高的,占空比几乎无误差,频率误差也在0.5%以内。得益于完善的Demo和库文件,进行外设接口开发很简单拿来就可使用,可以只关注应用逻辑的开发。
---------------------
作者:qinyunti
链接:https://bbs.21ic.com/icview-3305732-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。
---------------------
作者:qinyunti
链接:https://bbs.21ic.com/icview-3305732-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。