/** ****************************************************************************** * @file Project/main.c * @author MCD Application Team * @version V2.0.0 * @date 25-February-2011 * @brief Main program body ****************************************************************************** * @attention * * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. * ******************************************************************************* */ /* Includes ------------------------------------------------------------------*/ #include "stm8s.h" /* Private defines -----------------------------------------------------------*/ unsigned char const shumaguan[] = {0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90}; //ADCValue數組存放A/D采樣值,voltageADC為數字濾波后的結果 unsigned int ADCValue[10] = {0},ADCValue1[10] = {0},voltageADC = 0,voltageADC1 = 0; //voltage為電壓計算結果,單位mV unsigned int voltage = 0; unsigned int voltage1 = 0; unsigned int voltage11 = 0; /* Private function prototypes -----------------------------------------------*/ void ADConvert(void); void DigitalFiltering(void); void ADConvert1(void); void DigitalFiltering1(void); void Display(void); void Delay(unsigned int t); /* Private functions ---------------------------------------------------------*/ void main(void) { unsigned char i; //PG口數碼管段選,PE口數碼管位選 GPIO_Init(GPIOG,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_HIGH_FAST); GPIO_Init(GPIOE,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_HIGH_FAST); GPIO_Init(GPIOB,GPIO_PIN_ALL,GPIO_MODE_IN_FL_NO_IT); /*ADC2配置為: -連續轉換模式 -通道0(PB0) -fADC = fmaster/2 -觸發模式為定時器 -觸發關 -數據右對齊 -選擇通道0上的施密特觸發器 -施密特觸發器關*/ ADC2_Init(ADC2_CONVERSIONMODE_CONTINUOUS, ADC2_CHANNEL_0|ADC2_CHANNEL_1, ADC2_PRESSEL_FCPU_D2, ADC2_EXTTRIG_TIM, DISABLE, ADC2_ALIGN_RIGHT, ADC2_SCHMITTTRIG_CHANNEL0, DISABLE); /* Infinite loop */ while (1) { //連續轉換10次 ADC2_ConversionConfig(ADC2_CONVERSIONMODE_CONTINUOUS, ADC2_CHANNEL_0, ADC2_ALIGN_RIGHT); ADConvert(); //數字濾波 DigitalFiltering(); //連續轉換10次 ADC2_ConversionConfig(ADC2_CONVERSIONMODE_CONTINUOUS, ADC2_CHANNEL_1, ADC2_ALIGN_RIGHT); ADConvert1(); //數字濾波 DigitalFiltering1(); i = 200; while(i --) Display(); } } void ADConvert(void) { unsigned char count = 0; //連續轉換 ADC2->CR1 |= 0x02; ADC2_StartConversion(); while(count < 10) { //等待轉換結束 while(ADC2_GetFlagStatus() == RESET); //清除轉換結束標志位 ADC2_ClearFlag(); ADCValue[count] = ADC2_GetConversionValue(); count++; } //關閉連續轉換 ADC2->CR1 &= ~0X02; } void ADConvert1(void) { unsigned char count = 0; //連續轉換 ADC2->CR1 |= 0x02; ADC2_StartConversion(); while(count < 10) { //等待轉換結束 while(ADC2_GetFlagStatus() == RESET); //清除轉換結束標志位 ADC2_ClearFlag(); ADCValue1[count] = ADC2_GetConversionValue(); count++; } //關閉連續轉換 ADC2->CR1 &= ~0X02; } void DigitalFiltering(void) { unsigned char i,j; unsigned int temp; //對數組排序 for(i = 2;i >= 1;i--) { for(j = 0;j<(i-1);j++) { if(ADCValue[j] > ADCValue[j+1]) { temp = ADCValue[j]; ADCValue[j] = ADCValue[j+1]; ADCValue[j+1] = temp; } } } //舍棄最大和最小的兩個數,然后求平均值 voltageADC = 0; for(i = 2;i<=7;i++) voltageADC += ADCValue[i]; voltageADC /= 6; } void DigitalFiltering1(void) { unsigned char i,j; unsigned int temp; //對數組排序 for(i = 2;i >= 1;i--) { for(j = 0;j<(i-1);j++) { if(ADCValue1[j] > ADCValue1[j+1]) { temp = ADCValue1[j]; ADCValue1[j] = ADCValue1[j+1]; ADCValue1[j+1] = temp; } } } //舍棄最大和最小的兩個數,然后求平均值 voltageADC1 = 0; for(i = 2;i<=7;i++) voltageADC1 += ADCValue1[i]; voltageADC1 /= 6; } void Display(void) { unsigned char displayArray[8],i; voltage = (unsigned int)((unsigned long)voltageADC * 24155UL / 1023UL); voltage1 = (unsigned int)((unsigned long)voltageADC1 * 5064UL / 1023UL); voltage11 = (0.0142968 * voltage1 - 36.228) * 1000; //拆分數據,使用數碼管顯示 displayArray[7] = voltage11 / 1000; displayArray[6] = (voltage11 % 1000) / 100; displayArray[5] = (voltage11 % 100) / 10; displayArray[4] = voltage11 % 10; displayArray[3] = voltage / 10000; displayArray[2] = (voltage % 10000) / 1000; displayArray[1] = (voltage % 1000) / 100; displayArray[0] = voltage % 100/10; //使用數碼管顯示電壓值,單位mV GPIO_Write(GPIOG,shumaguan[displayArray[7]] & 0x7F); GPIO_Write(GPIOE,0x7F); Delay(100); GPIO_Write(GPIOG,shumaguan[displayArray[6]]); GPIO_Write(GPIOE,0xbF); Delay(100); GPIO_Write(GPIOG,shumaguan[displayArray[5]]); GPIO_Write(GPIOE,0xdF); Delay(100); GPIO_Write(GPIOG,shumaguan[displayArray[4]]); GPIO_Write(GPIOE,0xEF); Delay(100); GPIO_Write(GPIOG,shumaguan[displayArray[3]]); GPIO_Write(GPIOE,0xF7); Delay(100); GPIO_Write(GPIOG,shumaguan[displayArray[2]] & 0x7F); GPIO_Write(GPIOE,0xFb); Delay(100); GPIO_Write(GPIOG,shumaguan[displayArray[1]]); GPIO_Write(GPIOE,0xFd); Delay(100); GPIO_Write(GPIOG,shumaguan[displayArray[0]]); GPIO_Write(GPIOE,0xFe); Delay(100); GPIO_Write(GPIOE,0xFF); Delay(100); } void Delay(unsigned int t) { while(t--); } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval : None */ void assert_failed(u8* file, u32 line) { /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* Infinite loop */ while (1) { } } #endif /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
© COPYRIGHT 2011 STMicroelectronics
stm8 AD轉換雙路程序
全部回復(12)
正序查看
倒序查看