【AC7802x测评】+ ADC和PWM测试

一.前言

我们预计会实现一个通过旋转变压器控制蜂鸣器播放音乐,模拟”打碟器”的效果。这一篇先进行需要用到的接口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所有,任何人未经允许禁止转载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值