STM32-输出呼吸灯

目录

1. CubeMX设置

2. 程序开发 

3. 实验结果


1. CubeMX设置

原理:

捕获/比较模式寄存器1(TIMx_CCMR1)

OC1M[2:0]:输出比较1模式 (Output compare 1 enable)

110:PWM模式1- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。

111:PWM模式2- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。

打开cubeMX,设置TIM3时钟源为内部时钟,通道3为PWM输出,对于PB0: 

PSC分频设置200-1,计数周期为1024-1,CCR预加载Disable,开启NVIC中断:

2. 程序开发 

在main.c开启TIM3的时钟中断和PWM:

    //main.c	

    HAL_TIM_Base_Start_IT(&htim3);
	HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3);

在time.c输入如下代码,设置呼吸灯变量等:

//time.c

//控制输出波形的频率
__IO uint16_t period_class = 10;

/* LED亮度等级 PWM表,指数曲线 ,此表使用工程目录下的python脚本index_wave.py生成*/
uint16_t indexWave[] = {
1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 4,
4, 5, 5, 6, 7, 8, 9, 10, 11, 13,
15, 17, 19, 22, 25, 28, 32, 36,
41, 47, 53, 61, 69, 79, 89, 102,
116, 131, 149, 170, 193, 219, 250,
284, 323, 367, 417, 474, 539, 613,
697, 792, 901, 1024, 1024, 901, 792,
697, 613, 539, 474, 417, 367, 323,
284, 250, 219, 193, 170, 149, 131, 
116, 102, 89, 79, 69, 61, 53, 47, 41,
36, 32, 28, 25, 22, 19, 17, 15, 13, 
11, 10, 9, 8, 7, 6, 5, 5, 4, 4, 3, 3,
2, 2, 2, 2, 1, 1, 1, 1
	
};

//计算PWM表有多少个元素
uint16_t POINT_NUM = sizeof(indexWave)/sizeof(indexWave[0]); 

/* USER CODE BEGIN 1 */
/**
  * @brief  Period elapsed callback in non-blocking mode
  * @param  htim TIM handle
  * @retval None
  */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==TIM3)
	{
		static uint16_t pwm_index = 0;			//用于PWM查表
		static uint16_t period_cnt = 0;		//用于计算周期数
		
		period_cnt++;
		TIM3->CCR3=indexWave[pwm_index];
		
		if(period_cnt > period_class)
		{
			pwm_index++;    //标志PWM表指向下一个元素
			
			//若PWM表已到达结尾,重新指向表头
			if(pwm_index>=POINT_NUM)
			{
				pwm_index=0;
			}
			
			period_cnt=0;											//重置周期计数标志
		}
		
	}
	
}

3. 实验结果

灯像呼吸一样,一亮一暗的

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值