NXP JN5169使用定时器进行PWM输出和定时功能
NXP JN5169使用定时器进行PWM输出和定时功能
- 一、定时器介绍
- 1、定时器介绍
- 2、定时器可操作的模式
- 3、定时器DIO
- 4、定时器和PWM模式
- 5、定时器中断
- 二、实现代码
- 1、PWM输出
- 2、定时器模式
一、定时器介绍
1、定时器介绍
JN516x 器件有 5 个定时器:定时器0、定时器 1、定时器 2、定时器 3 和定时器 4。
注:这些定时器与唤醒定时器和节拍定时器有所不同。
定时器框图:
这些定时器提供了下面一系列的操作模式:
- 定时器模式
- 脉宽调制(PWM)模式
- 计数器模式
- 捕获模式
- Delta-Sigma 模式
但是,并非全部定时器都可以在所有模式下操作。定时器 1-4 不支持需要外部输入的模式(这些是计数器模式和捕获模式)。
2、定时器可操作的模式
JN516x 微控制器可使用下面的定时器模式:定时器、脉宽调制(PWM)、计数器、捕获和Delta-Sigma。下表对这些模式以及每个模式所需的函数(在调用 vAHI_TimerEnable( )后)进行总结。除非特别说明,所有 JN516x 定时器都支持这些模式。
模式 | 描述 | 函数 |
---|---|---|
定时器 | 源时钟用于产生一个脉冲周期,这个周期由在正脉冲边沿以前的时钟周期数和负脉冲边沿以前的时钟周期数来定义。中断可以在任一边沿或两个边沿上产生。脉冲周期在‘单次触发’模式下只产生一次,在‘重复’模式下连续产生。 |
vAHI_TimerConfigureOutputs( ) vAHI_TimerStartSingleShot( ) 或 vAHI_TimerStartRepeat( ) |
PWM | PWM 模式与定时器模式相同,但在 DIO 管脚上输出的脉宽调制信号除外(这取决于所使用的特定定时器)。 |
vAHI_TimerConfigureOutputs( ) vAHI_TimerStartSingleShot( ) 或 vAHI_TimerStartRepeat( ) |
计数器 | 定时器用于对作为外部时钟输入的外部输入信号边沿进行计数。定时器可以只计数上升沿或计数上升沿和下降沿。定时器 0 支持该模式,但定时器 1-4 不支持该模式。 |
vAHI_TimerClockSelect( ) vAHI_TimerConfigureInputs( ) vAHI_TimerStartSingleShot( ) 或 vAHI_TimerStartRepeat( ) u16AHI_TimerReadCount( ) |
捕获 | 外部输入信号在源时钟的每个节拍上采样。捕获的结果允许计算采样信号的周期和脉宽。如果需要,可以读取结果而无需停止定时器。定时器 0 支持该模式,但定时器 1-4 不支持该模式 |
vAHI_TimerConfigureInputs( ) vAHI_TimerStartCapture( ) vAHI_TimerReadCapture( ) 或 vAHI_TimerReadCaptureFreeRunning( ) |
Delta-Sigma | 定时器用作一个低速率的 DAC。转换信号在 DIO 管脚上输出(这取决于使用的特定定时器),需要简单过滤来得到模拟信号。Delta-Sigma模式可以在 NRZ 和 RTZ 这两种选择下使用。 | vAHI_TimerStartDeltaSigma( ) |
3、定时器DIO
定时器可使用特定的 DIO 管脚,如下表所示。
定时器 0 DIO[1] | 定时器 1 DIO[1] | 定时器 2 DIO[1] | 定时器 3 DIO[1] | 定时器 4 DIO[1] | 功能 |
---|---|---|---|---|---|
8 | 不使用[2] | 不使用[2] | 不使用[2] | 不使用[2] | 时钟或门控输入(在计数器模式下使用) |
9 | 不使用[2] | 不使用[2] | 不使用[2] | 不使用[2] | 捕获模式输入 |
10 | 11 | 12 | 13 | 17 | PWM 和 Delta-Sigma 模式输出 |
[1] vAHI_TimerSetLocation( )可用于将定时器 0 信号从 DIO8-10 传输到 DIO2-4 或将定时器 1-4 信号从DIO11-13 和 DIO17 传输到 DIO5-8。或者这个函数也可以用于将定时器 2 和定时器 3 信号分别放置于 DO0 和DO1(数字输出)。
[2] 定时器 1-4 没有输入。
默认情况下,与使能定时器相关的 DIO 管脚保留给定时器使用,但在定时器禁能时变为给通用输入/输出(GPIO)使用。通过调用函数vAHI_TimerDIOControl( ),分配给定时器的 DIO管脚也可以释放给 GPIO 使用。或者,函数 vAHI_TimerFineGrainDIOControl( )也可以将 DIO配置为同时给所有定时器使用,还可以单独使用这个函数来释放与定时器 0 相关的 3 个 DIO 管脚。
注:在使用 vAHI_TimerEnable( ) 使能定时器前执行上述的 DIO 配置,以消除定时器操作期间在 GPIO 上产生的干扰。
4、定时器和PWM模式
定时器模式允许定时器产生一个指定周期的矩形波形,其中这个波形开始为低电平,接着在特定的时间后变为高电平。这些时间在定时器启动时被指定(如下所示),见下面的参数:
- Time to rise(μ16Hi):这是启动定时器和(首次)低-到-高跳变之间的时钟周期数。中断可以在这个跳变时产生;
- Time to fall(μ16Lo):这是启动定时器和(首次)高-到-低跳变之间的时钟周期数(一个有效的脉冲周期)。中断可以在这个跳变时产生。
这些时间和定时器信号在下面的图中说明。
在定时器模式内有 2 个子模式,定时器使用不同的函数在这些模式下启动:
- 单次触发模式:定时器产生一个脉冲周期(如图 7.1所示),接着停止。可使用函数vAHI_TimerStartSingleShot()在该模式下启动定时器;
- 重复模式:定时器产生一连串脉冲(其中的重复率由配置的“time to fall”周期来决定,见上面的描述)。可使用函数 vAHI_TimerStartRepeat( )在该模式下启动定时器。
一旦启动,就可以使用函数 vAHI_TimerStop( )来停止定时器。
PWM(脉宽调制)模式与定时器模式相同,但在 DIO 管脚上输出产生的波形除外。这个输出可以在函数vAHI_TimerEnable( )中使能。这个输出也可以使用函数 vAHI_TimerConfigureOutputs( )翻转。
5、定时器中断
在函数 vAHI_TimerEnable( )中,定时器可以在出现下面的一种情况或两种情况时配置为产生中断:
- 在定时器输出的上升沿(低电平周期的末尾)
- 在定时器输出的下降沿(整个定时器周期的末尾)
定时器中断的处理必须包含在特殊定时器用户定义的回调函数中。这些回调函数使用各个定时器专用的注册函数来注册:
- vAHI_Timer0RegisterCallback( ) 用于定时器 0
- vAHI_Timer1RegisterCallback( ) 用于定时器 1
- vAHI_Timer2RegisterCallback( ) 用于定时器 2
- vAHI_Timer3RegisterCallback( ) 用于定时器 3
- vAHI_Timer4RegisterCallback( ) 用于定时器 4
当出现 E_AHI_DEVICE_TIMER0、E_AHI_DEVICE_TIMER1、E_AHI_DEVICE_TIMER2、E_AHI_DEVICE_TIMER3 或E_AHI_DEVICE_TIMER4 类型的中断时,会自动调用相关的回调函数。从传递给函数的位图表中可以识别中断的确切信息(上面列出的两种情况的中断)。需要注意的是,在调用回调函数之前中断将自动清除。
二、实现代码
1、PWM输出
软件模拟PWM输出IO为:DIO3
硬件PWM输出IO为: DIO13
相关宏定义
#define TIMER0 E_AHI_TIMER_0
#define TIMER1 E_AHI_TIMER_1
#define TIMER2 E_AHI_TIMER_2
#define TIMER3 E_AHI_TIMER_3
#define TIMER4 E_AHI_TIMER_4#define TIMER_PRESCALE 3 /* 定时器预分值,TIMER_FREQUENCY = 16 / (2 ^ TIMER_PRESCALE)*/
#define TIMER_FREQUENCY 16 / (pow(2, TIMER_PRESCALE)) /* 定时器时钟 2MHz */
#define TIMER_TIMING 1000 /* 定时器定时时间 time = 1000us ,时间单位us */
#define TIMER_COUNT TIMER_FREQUENCY * TIMER_TIMING /* 定时器一个有效的脉冲周期的时钟周期数, 即定时器初值*/
#define LOW_PULSE 30 /* 低电平占比(0 - 100),为一个有效的脉冲周期内低电平所占的时钟周期数*/
#define LOW_PULSE_VALUE TIMER_COUNT * (LOW_PULSE / 100.0) /* 低电平时钟数值*/#define PWM_FREQUENCY 1 / (TIMER_TIMING / 1000000.0) /* PWM频率,单位Hz*/#define PWM_LED (1 << 3) //软件模拟PWM输出DIO#define LED_ON(Led) vAHI_DioSetOutput(0, Led)
#define LED_OFF(Led) vAHI_DioSetOutput(Led, 0)
定时器初始化代码
PRIVATE void vTimerInit(void)
{/*定时器3输出PWM*/vAHI_TimerEnable(TIMER3, //定时器3TIMER_PRESCALE, //8分频,定时器时钟为2MHzTRUE, //开启上升输出(从低到高)中断TRUE, //开启定时器周期结束时(从高到低)中断TRUE); //启用DIO上定时器信号的输出vAHI_Timer3RegisterCallback(vCbTimer3); //注册中断回调/*** 定时器初值计算方法:* 外设时钟 fsys = 16MHz* 定时器时钟根据vAHI_TimerEnable()函数的u8Prescale分频系数算出* Tsys = 16 / (2 ^ u8Prescale)* 假设u8Prescale = 3, Tsys = 16 / (2 ^ 3) = 16 / 8 = 2MHz* 假如要定时 time = 1000us* 定时器一个有效的脉冲周期u16Lo = time * Tsys = 1000 * 2 = 2000* 所以vAHI_TimerStartRepeat()函数的 u16Lo = 2000 (一个有效的脉冲周期的时钟周期数)* 假设开启了vAHI_TimerEnable()函数的定时器周期结束中断bIntPeriodEnable = TRUE,则产生一次中断的时间为 1000us* vAHI_TimerStartRepeat()函数的 u16Hi 为一个有效的脉冲周期内低电平所占的时钟周期数* 当 u16Hi = 1000时,即在一个1000us的脉冲周期内,低电平占500us*/vAHI_TimerStartRepeat(TIMER3, //定时器3LOW_PULSE_VALUE, //一个有效的脉冲周期的低电平时钟周期数。中断可以在这个跳变时产生;TIMER_COUNT //一个有效的脉冲周期的时钟周期总数。中断可以在这个跳变时产生。);
}
定时器中断回调函数
PRIVATE void vCbTimer3 (uint32 u32Device, uint32 u32ItemBitmap)
{//软件模拟PWM输出实现if(E_AHI_DEVICE_TIMER3 == u32Device){ //定时器3中断if(E_AHI_TIMER_RISE_MASK == u32ItemBitmap){ //上升输出(从低到高)中断LED_OFF(PWM_LED); //输出低电平}else{LED_ON(PWM_LED); //输出高电平}}
}
完整代码
PRIVATE void vCbTimer3 (uint32 u32Device, uint32 u32ItemBitmap);
PRIVATE void vTimerInit(void);
PRIVATE void vPWMDIOsInit(void);PUBLIC void AppColdStart (void)
{vAHI_WatchdogStop();(void)u32AHI_Init();vPWMDIOsInit();vUartInit();vTimerInit();/*** 软件模拟PWM输出IO为:DIO3* 硬件PWM输出IO为: DIO13* */while (1) {vAHI_CpuDoze(); /* Doze */}
}PUBLIC void AppWarmStart (void)
{AppColdStart();
}PRIVATE void vCbTimer3 (uint32 u32Device, uint32 u32ItemBitmap)
{if(E_AHI_DEVICE_TIMER3 == u32Device){ //定时器3中断if(E_AHI_TIMER_RISE_MASK == u32ItemBitmap){ //上升输出(从低到高)中断LED_OFF(PWM_LED);}else{LED_ON(PWM_LED);}}
}PRIVATE void vTimerInit(void)
{/*定时器0输出PWM*///vAHI_TimerSetLocation(TIMER0, TRUE, FALSE); //将定时器 0 信号从 DIO8-10 传输到 DIO2-4vAHI_TimerEnable(TIMER3, //定时器3TIMER_PRESCALE, //8分频,定时器时钟为2MHzTRUE, //开启上升输出(从低到高)中断TRUE, //开启定时器周期结束时(从高到低)中断TRUE); //启用DIO上定时器信号的输出vAHI_Timer3RegisterCallback(vCbTimer3); //注册中断回调/*** 定时器初值计算方法:* 外设时钟 fsys = 16MHz* 定时器时钟根据vAHI_TimerEnable()函数的u8Prescale分频系数算出* Tsys = 16 / (2 ^ u8Prescale)* 假设u8Prescale = 3, Tsys = 16 / (2 ^ 3) = 16 / 8 = 2MHz* 假如要定时 time = 1000us* 定时器一个有效的脉冲周期u16Lo = time * Tsys = 1000 * 2 = 2000* 所以vAHI_TimerStartRepeat()函数的 u16Lo = 2000 (一个有效的脉冲周期的时钟周期数)* 假设开启了vAHI_TimerEnable()函数的定时器周期结束中断bIntPeriodEnable = TRUE,则产生一次中断的时间为 1000us* vAHI_TimerStartRepeat()函数的 u16Hi 为一个有效的脉冲周期内低电平所占的时钟周期数* 当 u16Hi = 1000时,即在一个1000us的脉冲周期内,低电平占500us*/vAHI_TimerStartRepeat(TIMER3, //定时器3LOW_PULSE_VALUE, //一个有效的脉冲周期的低电平时钟周期数。中断可以在这个跳变时产生;TIMER_COUNT //一个有效的脉冲周期的时钟周期总数。中断可以在这个跳变时产生。);
}//软件模拟PWM输出DIO初始化
PRIVATE void vPWMDIOsInit (void)
{vAHI_DioSetDirection(0, PWM_LED);vAHI_DioSetPullup(PWM_LED, 0);
}
输出演示:
2、定时器模式
相关宏定义
#define TIMER0 E_AHI_TIMER_0
#define TIMER1 E_AHI_TIMER_1
#define TIMER2 E_AHI_TIMER_2
#define TIMER3 E_AHI_TIMER_3
#define TIMER4 E_AHI_TIMER_4#define TIMER_PRESCALE 3 /* 定时器预分值,TIMER_FREQUENCY = 16 / (2 ^ TIMER_PRESCALE)*/
#define TIMER_FREQUENCY 16 / (pow(2, TIMER_PRESCALE)) /* 定时器时钟 2MHz */
#define TIMER_TIMING 1000 /* 定时器定时时间 time = 1000us ,时间单位us */
#define TIMER_COUNT TIMER_FREQUENCY * TIMER_TIMING /* 定时器一个有效的脉冲周期的时钟周期数, 即定时器初值*/
#define LOW_PULSE 50 /* 低电平占比(0 - 100),为一个有效的脉冲周期内低电平所占的时钟周期数*/
#define LOW_PULSE_VALUE TIMER_COUNT * (LOW_PULSE / 100.0) /* 低电平时钟数值*/#define PWM_FREQUENCY 1 / (TIMER_TIMING / 1000000.0) /* PWM频率,单位Hz*/#define PWM_LED (1 << 3) //软件模拟PWM输出DIO#define LED_ON(Led) vAHI_DioSetOutput(0, Led)
#define LED_OFF(Led) vAHI_DioSetOutput(Led, 0)
定时器初始化代码
PRIVATE void vTimerInit(void)
{/*定时器0输出PWM*///vAHI_TimerSetLocation(TIMER0, TRUE, FALSE); //将定时器 0 信号从 DIO8-10 传输到 DIO2-4vAHI_TimerEnable(TIMER3, //定时器3TIMER_PRESCALE, //8分频,定时器时钟为2MHzTRUE, //开启上升输出(从低到高)中断TRUE, //开启定时器周期结束时(从高到低)中断FALSE); //关闭DIO上定时器信号的输出vAHI_Timer3RegisterCallback(vCbTimer3); //注册中断回调/*** 定时器初值计算方法:* 外设时钟 fsys = 16MHz* 定时器时钟根据vAHI_TimerEnable()函数的u8Prescale分频系数算出* Tsys = 16 / (2 ^ u8Prescale)* 假设u8Prescale = 3, Tsys = 16 / (2 ^ 3) = 16 / 8 = 2MHz* 假如要定时 time = 1000us* 定时器一个有效的脉冲周期u16Lo = time * Tsys = 1000 * 2 = 2000* 所以vAHI_TimerStartRepeat()函数的 u16Lo = 2000 (一个有效的脉冲周期的时钟周期数)* 假设开启了vAHI_TimerEnable()函数的定时器周期结束中断bIntPeriodEnable = TRUE,则产生一次中断的时间为 1000us* vAHI_TimerStartRepeat()函数的 u16Hi 为一个有效的脉冲周期内低电平所占的时钟周期数* 当 u16Hi = 1000时,即在一个1000us的脉冲周期内,低电平占500us*/vAHI_TimerStartRepeat(TIMER3, //定时器3LOW_PULSE_VALUE, //一个有效的脉冲周期的低电平时钟周期数。中断可以在这个跳变时产生;TIMER_COUNT //一个有效的脉冲周期的时钟周期总数。中断可以在这个跳变时产生。);
}
定时器中断回调函数
PRIVATE void vCbTimer3 (uint32 u32Device, uint32 u32ItemBitmap)
{if(E_AHI_DEVICE_TIMER3 == u32Device){ //定时器3中断//vPrintf("u32Device = %s \n", "E_AHI_DEVICE_TIMER3");if(E_AHI_TIMER_RISE_MASK == u32ItemBitmap){ //上升输出(从低到高)中断if(++count_ris > 499){ //0.5scount_ris = 0;vPutStrs((uint8*)"Interrupt = E_AHI_TIMER_RISE_MASK, Count Time = 0.5 second \n");}}if(E_AHI_TIMER_PERIOD_MASK == u32ItemBitmap){ //定时器周期结束时(从高到低)中断if(++count_sec > 999){ //1scount_sec = 0;vPutStrs((uint8*)"Interrupt = E_AHI_TIMER_PERIOD_MASK, Count Time = 1 second \n");}}if((E_AHI_TIMER_RISE_MASK | E_AHI_TIMER_PERIOD_MASK) == u32ItemBitmap){//vPrintf("Interrupt = %s \n", "E_AHI_TIMER_RISE_MASK & E_AHI_TIMER_PERIOD_MASK");}}
}
完整代码
PRIVATE void vPutChar(unsigned char c);
PRIVATE void vPutStrs(unsigned char *str);
PRIVATE void vUartInit(void);
PRIVATE void vCbTimer3 (uint32 u32Device, uint32 u32ItemBitmap);
PRIVATE void vTimerInit(void);uint32 count_sec = 0;
uint32 count_ris = 0;PUBLIC void AppColdStart (void)
{vAHI_WatchdogStop();(void)u32AHI_Init();count_sec = 0;count_ris = 0;vUartInit();vTimerInit();while (1) {vAHI_CpuDoze(); /* Doze */}
}PUBLIC void AppWarmStart (void)
{AppColdStart();
}PRIVATE void vCbTimer3 (uint32 u32Device, uint32 u32ItemBitmap)
{if(E_AHI_DEVICE_TIMER3 == u32Device){ //定时器3中断//vPutStrs("u32Device = E_AHI_DEVICE_TIMER3 \n");if(E_AHI_TIMER_RISE_MASK == u32ItemBitmap){ //上升输出(从低到高)中断if(++count_ris > 499){ //0.5scount_ris = 0;vPutStrs((uint8*)"Interrupt = E_AHI_TIMER_RISE_MASK, Count Time = 0.5 second \n");}}if(E_AHI_TIMER_PERIOD_MASK == u32ItemBitmap){ //定时器周期结束时(从高到低)中断if(++count_sec > 999){ //1scount_sec = 0;vPutStrs((uint8*)"Interrupt = E_AHI_TIMER_PERIOD_MASK, Count Time = 1 second \n");}}if((E_AHI_TIMER_RISE_MASK | E_AHI_TIMER_PERIOD_MASK) == u32ItemBitmap){//vPutStrs("Interrupt = E_AHI_TIMER_RISE_MASK & E_AHI_TIMER_PERIOD_MASK \n");}}
}PRIVATE void vTimerInit(void)
{/*定时器0输出PWM*///vAHI_TimerSetLocation(TIMER0, TRUE, FALSE); //将定时器 0 信号从 DIO8-10 传输到 DIO2-4vAHI_TimerEnable(TIMER3, //定时器3TIMER_PRESCALE, //8分频,定时器时钟为2MHzTRUE, //开启上升输出(从低到高)中断TRUE, //开启定时器周期结束时(从高到低)中断FALSE); //关闭DIO上定时器信号的输出vAHI_Timer3RegisterCallback(vCbTimer3); //注册中断回调/*** 定时器初值计算方法:* 外设时钟 fsys = 16MHz* 定时器时钟根据vAHI_TimerEnable()函数的u8Prescale分频系数算出* Tsys = 16 / (2 ^ u8Prescale)* 假设u8Prescale = 3, Tsys = 16 / (2 ^ 3) = 16 / 8 = 2MHz* 假如要定时 time = 1000us* 定时器一个有效的脉冲周期u16Lo = time * Tsys = 1000 * 2 = 2000* 所以vAHI_TimerStartRepeat()函数的 u16Lo = 2000 (一个有效的脉冲周期的时钟周期数)* 假设开启了vAHI_TimerEnable()函数的定时器周期结束中断bIntPeriodEnable = TRUE,则产生一次中断的时间为 1000us* vAHI_TimerStartRepeat()函数的 u16Hi 为一个有效的脉冲周期内低电平所占的时钟周期数* 当 u16Hi = 1000时,即在一个1000us的脉冲周期内,低电平占500us*/vAHI_TimerStartRepeat(TIMER3, //定时器3LOW_PULSE_VALUE, //一个有效的脉冲周期的低电平时钟周期数。中断可以在这个跳变时产生;TIMER_COUNT //一个有效的脉冲周期的时钟周期总数。中断可以在这个跳变时产生。);
}/*发送单个字符*/
PRIVATE void vPutChar(unsigned char c)
{while (!(u8AHI_UartReadLineStatus(UART) & E_AHI_UART_LS_THRE)); /*发送FIFO为空*/vAHI_UartWriteData(UART, c); /*写入要发送的字符*//*发送移位寄存器为空或者发送FIFO为空,即等待发送完毕E_AHI_UART_LS_THRE | E_AHI_UART_LS_TEMT = 0x20 | 0x40 = 0x60*/while ((u8AHI_UartReadLineStatus(UART) & (E_AHI_UART_LS_THRE | E_AHI_UART_LS_TEMT))!= (E_AHI_UART_LS_THRE | E_AHI_UART_LS_TEMT));
}
/*发送字符串*/
PRIVATE void vPutStrs(unsigned char *str)
{while(*str){vPutChar(*str++);}
}/*初始化串口*/
PRIVATE void vUartInit(void)
{#if (UART == E_AHI_UART_0)vAHI_UartSetRTSCTS(UART, FALSE); /* UART0 2线模式。Disable use of CTS/RTS */
#endifvAHI_UartEnable(UART);//复位指定UART的发送和接收FIFO,并将FIFO触发级别设置为单字节触发vAHI_UartReset(UART,TRUE, /* 复位收发FIFO*/TRUE);vAHI_UartSetBaudRate(UART, E_AHI_UART_RATE_115200); /* 设置波特率*/vInitPrintf((void *)vPutChar);
}
输出演示:
NXP JN5169使用定时器进行PWM输出和定时功能相关推荐
- 【STM32】通用定时器的PWM输出(实例:PWM输出)
STM32F1xx官方资料: <STM32中文参考手册V10>-第14章 通用定时器 通用定时器PWM概述 STM32定时器输出通道引脚 这里以TIM3为例来讲解.STM32的通用定时器 ...
- AT32(四):TMR——定时器、PWM输出与捕获
前言 用AT32F421的基础定时器TMR6配合中断实现定时功能,用通用定时器TMR3实现PMW波的输出与捕获.本文记录了测试AT32F4单片机定时器的过程. 环境 VScode ( EIDE + C ...
- Linux驱动-使用软定时器实现PWM输出
Linux驱动-使用软定时器实现PWM输出 在没有pwm外设的情况下,可以使用定时器+GPIO的方法来实现pwm输出,实现pwm频率和占空比可控的功能.本文实现了一个Linux内核驱动,使用两个软 ...
- stm32通用定时器的PWM输出
配置过程:(以TIM3为例,其CH1-CH4为:PA6.PA7.PB0.PB1) 1)开启TIM3时钟,配置4个IO口为复用推挽输出. 2)设置TIM3的ARR和PSC来控制PWM的周期. 3)设置T ...
- stm32无源蜂鸣器定时器_stm32定时器实现PWM输出控制无源蜂鸣器(HAL)
(一)PWM概念和原理 脉冲宽度调制(PWM),是英文"Pulse Width Modulation"的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有 ...
- 10.利用STM32定时器的PWM输出功能,直接获取PWM波形。
本实验向大家展示如何输出占空比固定的PWM波形. 1.工程的建立: 2.主函数代码: 3.pwm_output.c代码: 4.output.h代码: 5.结果: 6.结果显示不出来的请看上几节的文章, ...
- STM32-通用定时器-PWM输出
1 通用定时器PWM概述 1.1 STM32定时器输出通道引脚 这里以TIM3为例来讲解.STM32的通用定时器分为TIM2.TIM3.TIM4.TIM5,而每个定时器都有独立的4个通道可以用来作为 ...
- STM32L475裸机例程学习 定时器中断和PWM输出实验
定时器中断和PWM输出实验 所以阿-笔记的重要性哇!之前看过的内容在做后面的内容涉及到了发现没有笔记,看的时间太久远,竟然全部忘记了,真是个悲伤的故事:( 那就重来吧.由于这两个实验都跟TIM定时器关 ...
- STM32定时器—PWM 输出
26.1 关于 PWM 26.1.1 PWM 介绍 PWM(Pulse Width Modulation,脉冲宽度调制).是一种利用微处理器的数字输出来对模拟电路进行控制的技术,广泛应用在测量.通信. ...
最新文章
- Google要推输入法 是战略布局还是战术需要?
- 哈佛成功金句25则(看一遍,都会很有收获!)
- vlc rtsp流 转 http播放视频
- 捡到vivo手机怎么清除账号_大学保安两天两次跳湖为路人捡手机,您怎么看?...
- 您的屁股发热严重,请降温后使用。
- springboot 缓存ehcache的简单使用
- 网站集成支付宝接口安装教程
- Android Studio和Kotlin入门
- python怎么弄成黑色背景图片_怎么能把图片的黑色背景改成透明背景
- ENVI实验教程(8)实验八、高光谱与光谱分析
- React五——React-router
- 企业——Redis的高可用的搭建
- 流量变现|谁能拒绝私藏一套app流量变现的攻略呢?
- 一战托福5个月112分 经验分享 + 备考资料大放送
- QT自制复古武侠端游
- 全微分的充分条件和必要条件
- Dijkstra算法讲解(通过边实现松弛)
- Java md5加解密汉字_Java加解密_MD5
- Word插入NoteExpress插件时“运行错误429:ActiveX部件不能创建对象“解决方案
- php汽车门户源码,discuz仿汽车之家门户带论坛源码
热门文章
- 汉语拼音的36个韵母该怎么学?
- 2021 春季新品发布会上,苹果推出了全新配件 AirTag
- 锐捷ruijie无线控制器AC登录说明
- 2023全网首发抖音标签检测程序源码+花800买的/最新版本
- docker 安装的东西都在哪儿_Docker pull下来的镜像文件、创建出来的容器文件都存在本地的什么地方了?...
- 写给面临危机的计算机类学生们的肺腑之言 转
- Shader实现高光反射
- 几种查询局域网内在线弱电设备IP地址的方法,总有一款你会用的到
- Python OpenCV3 计算机视觉秘籍:1~5
- 【Bluetooth蓝牙开发】三、蓝牙调试工具【集合汇总】