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)
|