pwm采集,與4路輸出,不懂的就問
單片機源程序如下:
- #include "stm32f10x.h"
- #include "delay.h"
- #include "stm32f10x_tim.h"
- #include "Tim4ToTim1.h"
- #include "..\oled_spi\oled_spi.h"
- #include "..\oled_spi\bmp.h"
- #include "USART.h"
- //PWM波形輸出與測量實例
- //TIM4-Ch1(PB6-9) 輸出PWM波形到
- //Tim1-CH2(PA9)捕獲
- void InitLED1()//PB8對應板上LED1燈
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB , ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;
- GPIO_Init(GPIOB ,&GPIO_InitStructure) ;
- }
- uint32_t CntsforMs=0;
- uint32_t lastCntsforMs=0;
- void InitTimeCounter(void)//計時器
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); ///使能TIM3時鐘
-
- TIM_TimeBaseInitStructure.TIM_Period = 1000; //自動重裝載值
- TIM_TimeBaseInitStructure.TIM_Prescaler=71; //定時器分頻:72Mhz/(71+1)=1Mhz
- TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上計數模式
- TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
-
- TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化TIM3
-
- TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //允許定時器3更新中斷
- TIM_Cmd(TIM3,ENABLE); //使能定時器3
-
- NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //定時器3中斷
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //搶占優先級1
- NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子優先級3
- NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- }
- //定時器3中斷服務函數
- void TIM3_IRQHandler(void)
- {
- if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中斷
- {
- CntsforMs++;
- TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除中斷標志位
- }
- }
- uint32_t dT;
- char Line1[32],Line2[32],Line3[32],Line4[32],Line5[32],Line6[32],Line7[32];
- int main()
- {
- int cnts=0;
- int vol=3300;
- char buf1[16],buf2[16],buf3[16],buf4[16];
-
- DelayInit(72);
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級
- // InitLED1();//PB8點亮LED1燈
- InitTim4ToTim1();//PB6,7,8,9輸出PWM波形,Tim1-CH1(PA8)捕獲
- InitTimeCounter();//只用TIM3來計時
- uart1_init(9600);//PA9==Tx,PA10==Rx
- //uart1_send("Test:ABCD",8);
-
- OLED_Init();//PA4,5,7;PB0,1
- OLED_Display_On();
- OLED_DrawBMP(0,0,128,64,BMP1);
- DelayS(2);
- OLED_Clear();
- float heading=0.0;
- while(1)
- {
- uart1_send("1", 1);
- cnts++;
- dT = CntsforMs-lastCntsforMs;
- lastCntsforMs = CntsforMs;
- sprintf(Line1, "T=%dS,dT=%02dms", CntsforMs/1000,dT);
- TIM4->CCR3 = 20000-(cnts%2000)*10; //TIM4-Ch3(PB8) 輸出PWM波形到
-
- sprintf(Line2, "%dUs/%dus", PWM_Width*MinPwmWidth,PWM_Period*MinPwmWidth);//PWM波形寬度/PWM波形周期
- sprintf(Line3, "%.2f%s", PWM_Width*100.0/(float)PWM_Period,"%");//PWM波形占空比
-
- OLED__ShowStr(0,0,(u8*)Line1,2);
- OLED__ShowStr(0,2,(u8*)Line2,2);
- OLED__ShowStr(0,4,(u8*)Line3,2);
- if (USART1_RxState&0x8000)
- {
- USART1_RxState = 0;
- heading = (USART1_RxBuf[2]-0x30)*100.0+(USART1_RxBuf[3]-0x30)*10.0;
- heading += (USART1_RxBuf[4]-0x30)*1.0+(USART1_RxBuf[5]-0x30)*0.1;
- sprintf(Line4, "Head = %.1f", heading);//
- }
- OLED__ShowStr(0,6,(u8*)Line4,2);
- // DelayMs(100);
- }
- }
-
- /*********************************************END OF FILE**********************/
復制代碼
所有資料51hei提供下載:
TestStm32F103C8(中景園核心板+OLED+USART1+Tim4輸出PWM波形由Tim1測量實例+Tim3計時).7z
(48.34 KB, 下載次數: 9)
2019-10-11 17:21 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|