• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

stm8 AD转换双路程序

/**
  ******************************************************************************
  * @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.
  *
  * 

© COPYRIGHT 2011 STMicroelectronics

****************************************************************************** */ /* 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****/
全部回复(12)
正序查看
倒序查看
2014-05-13 19:34
希望可以帮助到有需要的朋友。
0
回复
2014-05-13 21:42
@SKY丶辉煌
希望可以帮助到有需要的朋友。
柴兄的帖子不错,支持一个!
0
回复
dapeng
LV.5
4
2014-05-14 08:29

不错,不得不顶

0
回复
2014-05-14 19:27
@yueyunno1
柴兄的帖子不错,支持一个!

嘿嘿,我这就是凤毛麟角,还是得多跟您学习啊。

这个是我们做校赛的时候电流采样的程序,觉得挺有意义的。一路AD采样和两路AD采样是质的变化,而两路采样AD和三路才是大同小异。

0
回复
2014-05-14 19:31
@dapeng
不错,不得不顶
谢谢~
0
回复
新月GG
LV.9
7
2014-05-15 09:12
@SKY丶辉煌
嘿嘿,我这就是凤毛麟角,还是得多跟您学习啊。这个是我们做校赛的时候电流采样的程序,觉得挺有意义的。一路AD采样和两路AD采样是质的变化,而两路采样AD和三路才是大同小异。

不明觉厉

0
回复
cltwolf
LV.5
8
2014-05-15 11:52

学习学习,虽然没玩过STM8。但从辉煌兄这程序看,看起来很高大上的样子。

0
回复
2014-05-15 12:41
@新月GG
不明觉厉
0
回复
SKY丶辉煌
LV.10
10
2014-05-15 12:42
@cltwolf
学习学习,虽然没玩过STM8。但从辉煌兄这程序看,看起来很高大上的样子。
谢谢兄弟!
0
回复
daihui713
LV.6
11
2014-05-16 17:17
AD求平均可以采用算数平均法,也可以采用加权平均法,后者会理想一点
0
回复
SKY丶辉煌
LV.10
12
2014-05-16 21:10
@daihui713
AD求平均可以采用算数平均法,也可以采用加权平均法,后者会理想一点

是的,算法不同

0
回复
红果
LV.1
13
2017-05-23 20:50
@SKY丶辉煌
是的,算法不同

正在学STM8,正在搞三路adc,正需要,多谢奉献。

0
回复