国赛stm32电源类题目的解答,下面是程序源码的介绍:
1.STM32的主频为72M 在定时器中计算定时时长要用到 72M/((分频+1)*(自动重装载+1))
2.IO口的工作方式主要是推挽输出(没有特殊要求时) 浮空输入(外部中断,计数器等) 复用(如定时器输出pwm)
3.SPI串行通信时注意空闲时电平高低和在哪点触发,SDO脚是GPIO_Mode_IPU好像浮空也行,可以尝试下 如果要在程序中修改SPI的触发
方式等 要先cmd disable 然后再修改CR1寄存器的值
4.AD和DA的供电是5V 要外接电源 USB供电只有3.3
5.显示尽量放优先级最低的中断,中断处理注意清除标志位
6.能不用delay就不要用,它会占用CPU做无用功
7.本例程中的各种变量未明确说明自己看程序研究,还有触摸只是玩玩的,要做触摸控制自己研究,另外外部中断该程序中未加,
根据需要自己加进去,注意包含IO口,EXIT和NVIC及中断处理
8.程序中很多功能注释掉了,自己取消注释看着用
Write By XHJ
stm32单片机源程序如下:
- #include "delay.h"
- #include "sys.h"
- #include "lcd.h"
- #include "usart.h"
- #include "math.h"
- #include "AD&DA.h"
- #include "Tim.h"
- /***************Write By XHJ******************/
- u16 AD_Buffer_Rx[8];
- __IO uint64_t IC2Value = 0;
- __IO uint64_t DutyCycle = 0;
- __IO uint64_t Frequency = 0;
- __IO uint64_t IC1Value = 0;
- __IO uint64_t DutyCycle1 = 0;
- __IO uint64_t Frequency1 = 0;
- uint64_t capture_Times,A,SHI,GE;
- uint64_t total_Time,total_Time1;
- uint64_t low_Time,low_Time1;
- u32 SIN_LUT_index = 0;
- u32 Cnt_Dir = 0;
- double Sin_Lut[360]= {0};
- double Sin_Lut2[360]= {0};
- double Sin_Lut3[360]= {0};
- u8 LowRangeFlag= 0;
- u8 HighRangeFlag= 0;
- u16 SetUpPara= 1;
- u16 amp = 1000;
- u16 fqc = 5; //fqc为正弦调幅波频率的1/10,单位Hz。
- u16 fz = 15; //fz为载波频率,单位kHz。
- u16 fe=10,flag=0,psc;
- u16 count=0; //计数值
- uint8_t TxBuffer1[] = "USART Interrupt Example: This is USART1 DEMO";
- uint8_t RxBuffer1[],rec_f,tx_flag,RxCounter1;
- #define PWMSetUpMax 2000
- /***********初始化生成sin数组****************/
- void SPWM_Init( void )
- {
- u16 i;
- for( i=0; i<360; i++) //A
- {
- Sin_Lut[i] = 100*cos(2*3.1415926*i/360.0);
- }
- for( i=0; i<360; i++) //B
- {
- Sin_Lut2[i] = 100*cos(2*3.1415926*(i-120)/360.0);
- }
- for( i=0; i<360; i++) //C
- {
- Sin_Lut3[i] = 100*cos(2*3.1415926*(i+120)/360.0);
- }
- }
- int main(void)
- {
- int i=1000;
- delay_init(); //延时函数初始化
- SPI1_Init(); //LCD SPI1初始化(包含各种时钟初始化)
- //uart3_init(9600); //串口初始化为9600
- LCD_MyInit(); //LCD 初始化
- SPI_Configuration(); //AD DA配置初始化 SPI2和GPIO
- POINT_COLOR=RED;//设置字体为红色
- BACK_COLOR=WHITE;//背景白色
- DAC7565_Init(); //DA初始化
- //SPWM_Init( ); //sin数组初始化
- //TIM_Configuration(); //定时器及中断向量配置
- //TIM_Cmd(TIM1,ENABLE); //打开定时器1
- /* TIM1 Main Output Enable */
- //TIM_CtrlPWMOutputs(TIM1, ENABLE);
- //TIM_Cmd(TIM2,ENABLE); //打开定时器2
- //TIM_Cmd(TIM3,ENABLE); //打开定时器3
- //TIM_Cmd(TIM4,ENABLE); //打开定时器4
- //设定AD值
- Set_DAValue(0,4000);
- Set_DAValue(1,3062);
- Set_DAValue(2,2048);
- Set_DAValue(3,1024);
- while(1)
- {
- i++;
- AD_Convert(); //AD轉換
- LCD_ShowNum(0,0,AD_Buffer_Rx[0],5,16); //显示AD值
- LCD_ShowNum(0,100,AD_Buffer_Rx[1],5,16);
- LCD_ShowNum(0,200,AD_Buffer_Rx[2],5,16);
- LCD_ShowNum(0,300,AD_Buffer_Rx[3],5,16);
- delay_ms(500);
- Set_DAValue(0,2000);
-
- // psc=648648/fe;
- // TIM1->PSC=psc; //预分频设置
- // if(flag==0)
- // {
- // fe+=10;
- // if(fe>=30000){flag=1;}
- // }
- // if(flag==1)
- // {
- // fe-=10;
- // if(fe<=10){flag=0;}
- // }
- // count=TIM2->CNT;
-
- }
- }
- /***********T2中断处理SPWM***********/
- void TIM2_IRQHandler(void)
- {
-
- TIM_Cmd(TIM1,DISABLE); //关闭定时器1
- // if( SIN_LUT_index == 360 )
- // {
- // SIN_LUT_index= 0;
- // }
- // TIM1->CCR1 = (u16)((18000/fz)-amp*Sin_Lut[SIN_LUT_index]*SetUpPara/PWMSetUpMax/1000.0);
- // TIM1->CCR2 = (u16)((18000/fz)-amp*Sin_Lut2[SIN_LUT_index]*SetUpPara/PWMSetUpMax/1000.0);
- // TIM1->CCR3 = (u16)((18000/fz)-amp*Sin_Lut3[SIN_LUT_index]*SetUpPara/PWMSetUpMax/1000.0);
- // SIN_LUT_index++;
- // if( SetUpPara < PWMSetUpMax )
- // {
- // SetUpPara++;
- // }
- TIM_ClearFlag(TIM2,TIM_FLAG_Update); //中断标志位清零
- }
- /***********T3中断处理***********/
- void TIM3_IRQHandler(void)
- {
- if(flag==0)
- {
- fe+=10;
- if(fe>=20000){flag=1;}
- }
- if(flag==1)
- {
- fe-=10;
- if(fe<=10){flag=0;}
- }
- psc=654545/fe;
- TIM1->PSC=psc; //预分频设置
- TIM_ClearFlag(TIM3,TIM_FLAG_Update); //中断标志位清零
- }
- /***********T4输入捕获***********/
- void TIM4_IRQHandler(void)
- {
- if (TIM_GetITStatus(TIM4, TIM_IT_CC2) != RESET)
- {
- /* Clear TIM8 Capture compare interrupt pending bit */
- TIM_ClearITPendingBit(TIM4, TIM_IT_CC2);
-
- /* Get the Input Capture value */
- IC2Value =TIM_GetCapture2(TIM4);
-
- if (IC2Value != 0)
- {
- /* Duty cycle computation */
- total_Time=IC2Value;
- //low_Time=TIM_GetCapture1(TIM4);
- //DutyCycle=(low_Time+1)*100/total_Time;
- //SHI=DutyCycle;
- low_Time=0;
- total_Time=0;
- /* Frequency computation */
- Frequency = SystemCoreClock/IC2Value/720; //72M/(TIM_Prescaler+1)/IC2Value
- }
- else
- {
- DutyCycle = 0;
- Frequency = 0;
- }
- }
- if (TIM_GetITStatus(TIM4, TIM_IT_CC1) != RESET)
- {
- /* Clear TIM8 Capture compare interrupt pending bit */
- TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);
-
- /* Get the Input Capture value */
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
STM32F103SimpleDemo.rar
(389.62 KB, 下载次数: 130)
|