stm32zet6_pwm输出_外部脉冲计数pwm脉冲个数

一、

1、完整工程下载链接
			https://download.csdn.net/download/qcddao4/14801288
		    没积分的关注收藏私信要一下。感谢。

二、硬件

基于原子的精英板,单片机型号stm32f103zet6.

三、实现的功能

1、TIM1 输出pwm.频率为 1 K 。引脚用PA11。
2、TIM3 配置为外部时钟输入模式。引脚用PD2。使能中断。
3、将PD2 和 PA11 短接,主函数串口打印 pwm脉冲个数。
4、控制TIM1 pwm 输出 4个周期后 停止输出。

四、效果

1、功能 3 效果

在这里插入图片描述

2、功能 4 效果

在这里插入图片描述

五、主函数和pwm 初始化 代码

1、主函数

 int main(void)
 {		
 	u16 t;  
	u16 len;	
	delay_init();	    	 //延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	uart_init(115200);	 //串口初始化为115200
 	LED_Init();			     //LED端口初始化
	KEY_Init();          //初始化与按键连接的硬件接口
	 
	TIM1_PWM_Init(100);  //不要传奇数   50  周期是500us   100 周期是1ms 
	TIM3_Init() ;     //配置 TIM2_CH1_ETR 为外部脉冲计数  并且使能中断  来一个上升沿进一次中断 
	 
 	while(1)
	{
		if(USART_RX_STA&0x8000)
		{					   
			len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
			printf("\r\n您发送的消息为:\r\n\r\n");
			for(t=0;t<len;t++)
			{
				USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据
				while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
			}
			printf("\r\n\r\n");//插入换行
			USART_RX_STA=0;
		}else
		{
		}
		
		delay_ms(200);
		printf("pwm脉冲个数%d \r\n",TIM_GetCounter(TIM3));
	}	 
 }

2、pwm初始化

void TIM1_PWM_Init(u16 arr )
{
		GPIO_InitTypeDef GPIO_InitStructure;
		TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; 
		TIM_OCInitTypeDef TIM_OCInitStructure; 

		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);   

		GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11 ; //|GPIO_Pin_8;    //11是ch4  8 是ch1
		GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
		GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输出   //
		GPIO_Init(GPIOA,&GPIO_InitStructure);

		TIM_TimeBaseInitStructure.TIM_Period = arr; //设置自动重装载寄存器周期的值
	    TIM_TimeBaseInitStructure.TIM_Prescaler = 719;//设置用来作为TIMx时钟频率预分频值 7199:10k
		TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;//设置时钟分割:TDTS = Tck_tim
		TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上计数模式
		TIM_TimeBaseInit(TIM1, & TIM_TimeBaseInitStructure);
	
		TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
		TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
		TIM_OCInitStructure.TIM_Pulse=arr/2;
		TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
		TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Set;
		TIM_OC4Init(TIM1,&TIM_OCInitStructure);

		TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);
		TIM_Cmd(TIM1,ENABLE);//ê1?ü?ò??ê§?üTIMxíaéè

		//下面这句是高级定时器才有,输出PWM必须打开
		TIM_CtrlPWMOutputs(TIM1, ENABLE);                             //pwm输出

}
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用STM32F103ZET6主从定时器模式输出固定脉冲个数PWM波,可以按照以下步骤进行操作: 1. 首先,配置主从定时器的基本参数。选择一个主定时器和一个从定时器,使它们工作在定时器模式和PWM输出模式下。 2. 配置主定时器的参数,例如周期、预分频系数等。这些参数将决定PWM波的频率。 3. 配置从定时器的参数,例如周期、预分频系数等。这些参数将决定PWM波的占空比。 4. 使用主定时器来触发从定时器的计数开始,使从定时器开始生成PWM波。 5. 在程序中使用计数器变量来记录生成的脉冲个数,当达到指定的脉冲个数后,停止从定时器的计数。 下面是一个简单的示例代码,展示了如何使用STM32Cube HAL库在STM32F103芯片上实现主从定时器模式输出固定脉冲个数PWM波: ```c #include "main.h" #include "stm32f1xx_hal.h" // 定义主从定时器句柄 TIM_HandleTypeDef htim1; TIM_HandleTypeDef htim2; // 记录脉冲个数 volatile uint32_t pulseCount = 0; const uint32_t targetPulseCount = 100; // 指定的脉冲个数 // 主定时器中断回调函数 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM1) { // 主定时器中断触发从定时器的计数开始 HAL_TIM_Base_Start(&htim2); } } // 从定时器中断回调函数 void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM2) { pulseCount++; // 记录脉冲个数 if (pulseCount >= targetPulseCount) { // 达到指定的脉冲个数后,停止从定时器的计数 HAL_TIM_Base_Stop(&htim2); pulseCount = 0; // 重置脉冲计数 } } } // 初始化主从定时器 void MX_TIM_Init(void) { // 初始化主定时器 TIM1 htim1.Instance = TIM1; htim1.Init.Prescaler = 0; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 999; // 设置周期为1000 htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_Base_Init(&htim1); // 初始化从定时器 TIM2 htim2.Instance = TIM2; htim2.Init.Prescaler = 0; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 999; // 设置周期为1000,即占空比为50% htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Init(&htim2); // 配置从定时器为PWM输出模式 TIM_OC_InitTypeDef sConfigOC; sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 500; // 设置初始占空比为50% sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1); } int main(void) { // 初始化HAL库 HAL_Init(); // 初始化主从定时器 MX_TIM_Init(); // 启动主定时器 HAL_TIM_Base_Start(&htim1); while (1) { // 主循环 // TODO: 其他任务 } } ``` 上述代码中,主定时器 TIM1 负责触发从定时器 TIM2 的计数开始,从定时器 TIM2 生成PWM波。在从定时器的中断回调函数中,通过记录脉冲个数并与目标脉冲个数进行比较,来控制生成的脉冲个数。 注意,以上代码仅为示例,实际应用中可能需要根据具体需求进行修改和适配。另外,确保在使用 STM32Cube HAL 库时已经正确配置了时钟和引脚相关的设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值