天天看點

stm32zet6_pwm輸出_外部脈沖計數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 效果

stm32zet6_pwm輸出_外部脈沖計數pwm脈沖個數一、二、硬體三、實作的功能四、效果五、主函數和pwm 初始化 代碼

2、功能 4 效果

stm32zet6_pwm輸出_外部脈沖計數pwm脈沖個數一、二、硬體三、實作的功能四、效果五、主函數和pwm 初始化 代碼

五、主函數和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輸出

}