國賽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
0.png (67.66 KB, 下載次數: 75)
下載附件
2017-5-18 21:28 上傳
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)
2017-5-18 20:46 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|