在做数字开关电源开发过程中使用最多的就是PWM功能和ADC采样功能。ADC采样时采样的时间点很重要,必须在PWM输出高电平的时候取采样,这样采样出来的数据才是最准确的。在STM8单片机中,可以通过定时器的TRG信号去触发ADC采样,这样就可以将PWM波形的输出和ADC采样结合在一起了。
下面就演示一下,如何在输出PWM波的过程中触发ADC采样。
首先看ADC的初始化代码。
#include "adc.h"
#include "main.h"
#include "led.h"
u16 DATAH = 0; //ADC转换值高8位
u16 DATAL = 0; //ADC转换值低8位
_Bool ADC_flag = 0; //ADC转换成功标志
u16 adc_cnt = 0;
//AD通道引脚初始化
void ADC_GPIO_Init( void )
{
PD_DDR &= ~( 1 << 2 ); //PD2 设置为输入 AIN3
PD_CR1 &= ~( 1 << 2 ); //PD2 设置为悬空输入
PD_DDR &= ~( 1 << 3 ); //PD3 设置为输入 AIN4
PD_CR1 &= ~( 1 << 3 ); //PD3 设置为悬空输入
}
//ch 为单片机的ADC 通道
//ADC输入通道初始化入口参数表示通道选择
void ADC_CH_Init( u8 ch )
{
char l = 0;
ADC_CR1 = 0x00; //fADC = fMASTER/2, 8Mhz 单次转换,禁止转换
ADC_CR2 = 0x00; //默认左对齐 读数据时先读高在读低
ADC_CR2 |= ( 1 << 6 ); //外部触发使能
ADC_CSR |= ch; //控制状态寄存器 选择要 AD输入通道 如:PD2(AIN3)
ADC_TDRL = ( 1 << ch ); //禁止相应通道 施密特触发功能 1左移ch位
ADC_CR1 |= 0x01; //使能ADC并开始转换
ADC_CSR |= ( 1 << 5 ); //EOCIE 使能转换结束中断 EOC中断使能
for( l = 0; l < 100; l++ ); //延时,保证ADC模块的上电完成 至少7us
ADC_CR1 = ADC_CR1 | 0x01; //再次将CR1寄存器的最低位置1 使能ADC 并开始转换
}
u16 value = 0;
//AD中断服务函数 中断号22
#pragma vector = 24 // IAR中的中断号,要在STVD中的中断号上加2
__interrupt void ADC_Handle( void )
{
ADC_CSR &= ~0x80; // 转换结束标志位清零 EOC
LED = 1;
//默认左对齐 读数据时先读高高8位 再读低8位
DATAH = ADC_DRH; // 读出ADC结果的高8位
DATAL = ADC_DRL; // 读出ADC结果的低8位
ADC_flag = 1; // ADC中断标志 置1
value = ( DATAH << 2 ) + DATAL ; //得到十位精度的数据 0--1024
adc_cnt++;
LED = 0;
}
ADC的初始化代码,比一般ADC的初始化代码只多了一条语句
ADC_CR2 |= ( 1 << 6 ); //外部触发使能
用来开启ADC的外部触发功能。
这里需要使能外部触发转换功能,设置外部触发事件为内部定时器1 TRG事件。不过EXTSEL位默认值就是00,所以这个位可以不用设置,只需要将EXTTRIG位设置为1。
下面初始化定时器1
#define FRE 1000 //frequency 频率 4M / 1000 = 4K
#define DUTY 500
void PWM_GPIO_Init( void )
{
PC_DDR |= ( 1 << 7 ); //PC7 推挽输出
PC_CR1 |= ( 1 << 7 );
PC_ODR_ODR7 = 0;
}
//使用定时器输出PWM触发ADC采样
//定时器1初始化
void TIM1_Init( void )
{
PWM_GPIO_Init();
TIM1_CCMR2 = ( 6 << 4 ) | ( 1 << 3 ) | ( 1 << 2 ); //TIM1 CH2 输出模式 PWM1
TIM1_CCER1 |= 0x10; //CC2为输出
TIM1_PSCRH = 0x00;
TIM1_PSCRL = 0x03; //16M/(1+3)=4 M
TIM1_ARRH = FRE >> 8; //设定自动重装载值高8位
TIM1_ARRL = FRE; //设置自动重装载值低8位
TIM1_CCR2H = DUTY >> 8; //捕获比较寄存器高8位
TIM1_CCR2L = DUTY; //捕获比较寄存器低8位 占空比值
TIM1_BKR = 0x80; //刹车寄存器 使能OC1输出 定时器不工作时输出无效电平
TIM1_CR2 |= ( 2 << 4 ); //使能信号,用于触发输出(TRGO)
TIM1_CR1 |= ( 0 << 5 ); //对齐模式
TIM1_CR1 |= 0x01; //允许定时器中断
}
定时器1的初始化代码也比正常输出PWM功能时多了一行代码。
TIM1_CR2 |= ( 2 << 4 ); //使能信号,用于触发输出(TRGO)
这里需要设置CR2寄存器中的MMS位。用来开启定时器的输出触发功能。
这样分别在ADC初始化和PWM初始化的代码中增加对CR2寄存器的设置,就可通过输出的PWM波来触发ADC的采样了。
最后在主函数中分别初始化ADC和定时器。
void main( void )
{
__asm( "sim" ); //禁止中断
SysClkInit();
delay_init( 16 );
LED_GPIO_Init();
ADC_GPIO_Init();
ADC_CH_Init(3);
TIM1_Init();
__asm( "rim" ); //开启中断
while( 1 )
{
}
}
接下来运行代码,查看运行结果,这里要注意一点,STM8输出PWM波时,需要设置选项字,如果选项字中TIM1_CH1和TIM1_CH2的功能未开启时,在输出引脚上是观察不到波形的。
在ADC中断中通过一个计数器来统计进入ADC中断的次数,在进入中断时将LED电平置高,在中断代码执行完成之后将LED电平置低。在示波器上观察PWM的波形和LED的波形。
黄色波形未PWM输出波形,绿色波形未LED输出波形。在每个PWM波的上升沿就触发一次ADC采样。
由于当前PWM输出是TIM1_CH2通道,所以在设置寄存器MMS位时,也可以将值设置为5.
经过实际测试,MMS位设置为2、3、5时程序都可以正常工作。
TIM1_CR2 |= ( 2 << 4 ); //使能信号,用于触发输出(TRGO)
TIM1_CR2 |= ( 3 << 4 ); //使能信号,用于触发输出(TRGO)
TIM1_CR2 |= ( 5 << 4 ); //使能信号,用于触发输出(TRGO)
通过改变CR1寄存器数据对齐模式和 CR2寄存器触发模式的值,可以改变ADC触发时间位置。
设置MMS值为3,CMS值为0.
输出波形如下:
设置MMS值为3,CMS值为2.
输出波形如下:
设置MMS值为3,CMS值为3.
输出波形如下:
设置MMS值为2,CMS值为3.
输出波形如下:
设置MMS值为2,CMS值为2.
输出波形如下:
设置MMS值为2,CMS值为0.
输出波形如下:
通过上面几组波形对比可以发现,ADC触发的时刻只能是在上升沿或者电平中点位置。不能后设置在任意位置触发,因为PWM的波形计数模式只有向上、向下或者中心对称模式。在向上或者向下计数模式中,中断一般只会触发一次,在中心对称模式计数时,中断会被触发两次,而中断触发的位置刚好是电平信号的中点位置。
上一篇:二、IAR创建工程并进行烧写
下一篇:STM8单片机ADC采样功能通过定时器触发
设计资源 培训 开发板 精华推荐
- DC292B-C,使用 LTC1709EG-9、12Vin、1.6Vout @ 45A 高电流 VRM 9.0 CPU 电源的演示板,主要是表面贴装电容
- EVAL-AD5327DBZ,用于 AD5327 12 位、四通道、电压输出数模转换器 (DAC) 的评估板
- ESP8266 黑水屏 驱动板
- 使用 Infineon Technologies AG 的 OM1325NT 的参考设计
- 【创意PCB】彩云伴月七彩小夜灯-402304A
- NCP130AMX210TCGEVB:NCP130AMX210TCG 偏置轨 LDO 稳压器演示板
- EV1HMC1120LP4、HMC1120LP4E 射频集成电路评估板
- LT8494IFE 450kHz、5V 输出 SEPIC 转换器的典型应用电路
- 使用 Microchip Technology 的 TCL1117-3.30 的参考设计
- AM1G-4818SH30Z 18V 1 瓦 DC-DC 转换器的典型应用
- 高性能 i.MX RT 处理器助力智能节点无需联网实现机器学习
- EEWORLD跨年芯币竞价——示波器、开发板、技术图书等你拿
- CadenceLIVE China 2022中国线上用户大会 报名中!
- Microchip 有奖直播|满足汽车电池管理系统 (BMS) 不断发展的安全标准
- 【答题有奖】Altera Cyclone V 开发板全体验之初识 & 评估Cyclone V !
- 艾睿电子技术解决方案展 2024 — 携手共建更智能绿色未来,火热报名中!
- 推陈出“芯“——TI 带你领略智能手机黑科技在线直播 预报名+看直播 好礼让你嗨翻全场!
- 有奖直播|相约Keysight World 2019“汽车电子及新能源汽车测试”论坛
- 有奖直播:NXP 汽车系统电源管理开讲啦,从功能安全架构到新品FS26,预约有礼~