一、简介
PWM:英文全称“Pulse Width Modulation”也叫“脉冲宽度调制”是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度控制。
1.1、结构框图线路
2.1、PWM原理
这个图简单的说,就是在0~ARR是一个周期需要的时间,通过CCRx来调整高低电平的占空比,CNT>=CCRx为高电平,否则为低电平,每当CNT=ARR时,CNT就会重新归零。
1.3、这里我们使用PA2这个引脚来输出PWM
从表中你给我们可以看出可以使用TIMER1_CH2通道,也可以使用TIMER4_CH2通道,也可以使用TIMER8_CH0通道,这里我们使用TIMER4_CH2来做PWM输出
二、函数介绍
2.1、函数汇总
库函数名称 | 库函数描述 |
timer_deinit | 复位外设TIMERx |
timer_struct_para_init | 初始化外设TIMER结构体参数 |
timer_init | 初始化外设TIMERx |
timer_enable | 使能外设TIMERx |
timer_disable | 除能外设TIMERx |
timer_auto_reload_shadow_enable | TIMERx自动重装载影子使能 |
timer_auto_reload_shadow_disable | TIMERx自动重装载影子除能 |
timer_update_event_enable | TIMERx更新使能 |
timer_update_event_disable | TIMERx更新除能 |
timer_counter_alignment | 设置外设TIMERx的对齐模式 |
timer_counter_up_direction | 设置外设TIMERx向上计数 |
timer_counter_down_direction | 设置外设TIMERx向下计数 |
timer_prescaler_config | 配置外设TIMERx预分频器 |
timer_repetition_value_config | 配置外设TIMERx的重复计数器 |
timer_autoreload_value_config | 配置外设TIMERx的自动重载寄存器 |
timer_counter_value_config | 配置外设TIMERx的计数器值 |
timer_counter_read | 读取外设TIMERx的计数器值 |
timer_prescaler_read | 读取外设TIMERx的预分频值 |
timer_single_pulse_mode_config | 配置外设TIMERx的单脉冲模式 |
timer_update_source_config | 配置外设TIMERx的更新源 |
timer_dma_enable | 外设TIMERx的DMA使能 |
timer_dma_disable | 外设TIMERx的DMA除能 |
timer_channel_dma_request_source_select | 外设TIMERx的通道DMA请求源选择 |
timer_dma_transfer_config | 配置外设TIMERx的DMA模式 |
timer_event_software_generate | 软件产生事件 |
timer_break_struct_para_init | 初始化外设TIMER终止功能结构体参数 |
timer_break_config | 配置终止功能 |
timer_break_enable | 使能TIMERx的终止功能 |
timer_break_disable | 除能TIMERx的终止功能 |
timer_automatic_output_enable | 自动输出使能 |
timer_automatic_output_disable | 自动输出除能 |
timer_primary_output_config | 所有的通道输出使能 |
timer_channel_control_shadow_config | 通道换相控制影子配置 |
timer_channel_control_shadow_update_config | 通道换相控制影子寄存器更新控制 |
timer_channel_output_struct_para_init | 初始化外设TIMER通道输出结构体参数 |
timer_channel_output_config | 外设TIMERx的通道输出配置 |
timer_channel_output_mode_config | 配置外设TIMERx通道输出比较模式 |
timer_channel_output_pulse_value_config | 配置外设TIMERx的通道输出比较值 |
timer_channel_output_shadow_config | 配置TIMERx通道输出比较影子寄存器功能 |
timer_channel_output_fast_config | 配置TIMERx通道输出比较快速功能 |
timer_channel_output_clear_config | 配置TIMERx的通道输出比较清0功能 |
timer_channel_output_polarity_config | 通道输出极性配置 |
timer_channel_complementary_output_polarity_config | 互补通道输出极性配置 |
timer_channel_output_state_config | 配置通道状态 |
timer_channel_complementary_output_state_config | 配置互补通道输出状态 |
timer_channel_input_struct_para_init | 初始化外设TIMER通道输入结构体参数 |
timer_input_capture_config | 配置TIMERx输入捕获参数 |
timer_channel_input_capture_presc | 配置TIMERx通道输入捕获预分频值 |
timer_channel_capture_value_register_read | 读取通道捕获值 |
timer_input_pwm_capture_config | 配置TIMERx捕获PWM输入参数 |
timer_hall_mode_config | 配置TIMERx的HALL接口功能 |
timer_input_trigger_source_select | TIMERx的输入触发源选择 |
timer_master_output_trigger_source_select | 选择TIMERx主模式输出触发 |
timer_slave_mode_select | TIMERx从模式配置 |
timer_master_slave_mode_config | TIMERx主从模式配置 |
timer_external_trigger_config | 配置TIMERx外部触发输入 |
timer_quadrature_decoder_mode_config | TIMERx配置为编码器模式 |
timer_internal_clock_config | TIMERx配置为内部时钟模式 |
timer_internal_trigger_as_external_clock_config | 配置TIMERx的内部触发为时钟源 |
timer_external_trigger_as_external_clock_config | 配置TIEMRx的外部触发作为时钟源 |
timer_external_clock_mode0_config | 配置TIMERx外部时钟模式0,ETI作为时钟源 |
timer_external_clock_mode1_config | 配置TIMERx外部时钟模式1 |
timer_external_clock_mode1_disable | TIMERx外部时钟模式1禁能 |
timer_interrupt_enable | 外设TIMERx中断使能 |
timer_interrupt_disable | 外设TIMERx中断除能 |
timer_interrupt_flag_get | 获取外设TIMERx的中断标志 |
timer_interrupt_flag_clear | 清除外设TIMERx的中断标志 |
timer_flag_get | 获取外设TIMERx的状态标志 |
timer_flag_clear | 清除外设TIMERx状态标志 |
2.2、timer_channel_output_config函数介绍
2.3、timer_channel_output_mode_config函数介绍
2.4、timer_channel_output_pulse_value_config函数介绍
三、功能实现
3.1、timer4_pwm_duty_set函数实现
uint16_t period_num=0;//这个变量用来保存自动重装载值
// 功能:调整pwm的占空比,1~100
// duty: 捕获/比较
void timer4_pwm_duty_set(uint16_t duty)
{
uint16_t pulse1=period_num/100.0*duty;
timer_channel_output_pulse_value_config(TIMER4, TIMER_CH_2,pulse1);
}
函数实现设置PWM的占空比,这个函数可以查看“2.1、PWM原理”这个图
变量介绍
period_nom:就是图中的ARR
pulse1:就是图中的CCRx
duty:是占空比
我们把period_nom分成100份,然后乘以duty就能得到设置的占空比
3.2、TIMER4_PWM_Init函数实现,就是用来初始化
//TIMER4 PWM输出初始化
void TIMER4_PWM_Init(uint16_t psc,uint16_t arr)
{
timer_parameter_struct timer_init_struct;//定义初始化结构体
timer_oc_parameter_struct timer_oc_init_struct;
rcu_periph_clock_enable(RCU_TIMER4);//使能TIMER4定时器
rcu_periph_clock_enable(RCU_AF);
rcu_periph_clock_enable(RCU_GPIOA);
gpio_init(GPIOA,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_2);//GPIO KEY 初始化
timer_deinit(TIMER4); //复位外设TIMERx
timer_init_struct.prescaler = psc;//设置分频系数
timer_init_struct.period = arr;//自动重装载值
timer_init_struct.alignedmode = TIMER_COUNTER_EDGE;//对齐方式
timer_init_struct.clockdivision = TIMER_CKDIV_DIV1;//时钟分频因子
timer_init_struct.counterdirection = TIMER_COUNTER_UP;//向上计数
timer_init(TIMER4,&timer_init_struct);
//PWM初始化
timer_oc_init_struct.outputstate = TIMER_CCX_ENABLE;
timer_channel_output_config(TIMER4,TIMER_CH_2,&timer_oc_init_struct);//外设TIMER4的通道输出配置
timer_channel_output_mode_config(TIMER4,TIMER_CH_2,TIMER_OC_MODE_PWM0);//通道2输出PWM比较模式
// timer_channel_output_pulse_value_config(TIMER4,TIMER_CH_2,arr/2);//配置外设TIMERx的通道输出比较值
period_num=arr;
timer4_pwm_duty_set(50);
timer_enable(TIMER4);//使能定时器4
}
3.3、主函数实现
int main(void)
{
SystemClock_Config();//系统时钟配置
systick_config();//systick配置
LED_Init();
TIMER4_PWM_Init(72-1,1000-1);
while(1)
{
}
return 0;
}
TiMER4_PWM_Init(72-1,1000-1);设置的其实就是1000Hz的频率,由于我们这个函数里面设置占空比为50,所以程序输出频率为1000Hz占空比为50。
频率=72Mhz/72/1000=1000Hz
3.4、函数结果如下
通过逻辑分析仪抓取发现程序输出结果符合预期