打印
[STM8]

关于STM8L的ADC和串口通信的问题

[复制链接]
6961|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
caipeifeng|  楼主 | 2012-6-27 10:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如何将STM8L151C6T6的ADC采集的电压数据用串口通信发挥到PC上,能不能给段程序实例,求高人帮忙指点
沙发
IJK| | 2012-6-27 13:45 | 只看该作者
这不难。
只需要把STM8L151C6T6的ADC例子,和串口通信例子 拼起来,就行了。

使用特权

评论回复
板凳
捡漏王子| | 2012-6-27 15:15 | 只看该作者
纯拼接工作了,库函数和编程实例就能解决问题

使用特权

评论回复
地板
caipeifeng|  楼主 | 2012-6-27 15:27 | 只看该作者
应该还需要在这基础上加点代码吧,我是初学着能不能详细一点,万分感谢

使用特权

评论回复
5
捡漏王子| | 2012-6-28 10:40 | 只看该作者
ADC采样的值传递给串口当作发送数据就可以

使用特权

评论回复
6
caipeifeng|  楼主 | 2012-7-2 21:38 | 只看该作者
我写的程序在调试时,串口调试软件只有在按复位键时才有数据显示,且串口调试软件的收帧数一直在增加,而且当把ADC的输入去掉是按复位键仍有数据传输,哪位高手帮忙解答一些是为什么

使用特权

评论回复
7
caipeifeng|  楼主 | 2012-7-2 21:40 | 只看该作者
附上程序:
#include "stm8l15x.h"
#include "stm8_eval.h"

/** @addtogroup STM8L15x_StdPeriph_Examples
  * @{
  */

/** @addtogroup ADC_AnalogWatchdog
  * @{
  */

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define ADC_RATIO              ((uint16_t) 806) /*ADC_RATIO = ( 3.3 * 1000 * 1000)/4095 */


/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
uint16_t ADCdata = 0;
uint16_t PotVoltage = 0;

/* Private function prototypes -----------------------------------------------*/
static void ADC_Config(void);
static void USART_Config(void);
void SendVoltage(uint16_t Voltage);


/* Private functions ---------------------------------------------------------*/

/**
  * @brief  Main program.
  * @param  None
  * @retval None
  */
void main(void)
{
  uint16_t i;
   /* ADC configuration -------------------------------------------*/
  ADC_Config();
/* USART configuration -------------------------------------------*/
   USART_Config();
    while (1)
   {
     /* Calculate voltage value*/
     PotVoltage = (uint16_t)((uint32_t)((uint32_t)ADCdata * (uint32_t)ADC_RATIO) / (uint32_t)1000);

     /* Display voltage value on LCD*/
     SendVoltage((uint16_t)PotVoltage);
     for(i=0;i<30000;i++)
     {
       ;
     }
   }

}
static void ADC_Config(void)
{
  /* Enable ADC1 clock */
  CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);
  
  /* Initialise and configure ADC1 */
  ADC_Init(ADC1, ADC_ConversionMode_Continuous, ADC_Resolution_12Bit, ADC_Prescaler_2);
  ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels, ADC_SamplingTime_384Cycles);

  /* Enable ADC1 */
  ADC_Cmd(ADC1, ENABLE);

  /* Enable ADC1 Channel 2 */
  ADC_ChannelCmd(ADC1, ADC_Channel_2, ENABLE);

  /* Enable Analog watchdog ADC1 Interrupt */
  ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);

  /* Enable Interrupts */
  enableInterrupts();

  /* Start ADC1 Conversion using Software trigger*/
  ADC_SoftwareStartConv(ADC1);
}
/**
   * @brief  Configure USART peripheral  
   * @param  None
   * @retval None
   */
static void USART_Config(void)
{
   /* USART configured as follow:
         - BaudRate = 115200 baud  
         - Word Length = 8 Bits
         - One Stop Bit
         - Odd parity
         - Receive and transmit enabled
         - USART Clock disabled
   */
  STM_EVAL_COMInit(COM1, (uint32_t)115200, USART_WordLength_8b, USART_StopBits_1,
                    USART_Parity_No, (USART_Mode_TypeDef)(USART_Mode_Tx | USART_Mode_Rx));
  /* Enable general interrupts */
   enableInterrupts();

   /* Enable the USART Transmit complete interrupt: this interrupt is generated when the USART
   transmit Shift Register is empty */
   USART_ITConfig(EVAL_COM1, USART_IT_RXNE, ENABLE);
   USART_ITConfig(EVAL_COM1, USART_IT_TC, ENABLE);
  /* Enable USART */
   USART_Cmd(EVAL_COM1, ENABLE);
  }

/**
  * @brief  Display the current RV voltage on the LCD.
  * @param  voltage: specifies the voltage to display.
  * @retval None
  */
void SendVoltage(uint16_t Voltage)
{
  uint8_t i,tmp[3];
  if(i>10) return;
  for(i=0; i<4; i++)
        {
            tmp[i] = PotVoltage%10;                   //tmp[0]为个位, tmp[1]为十位, 依次类推
                PotVoltage = PotVoltage/10;
        }
       
        //先发高位,再位低位,最后是个位
        for(i=0; i<4; i++)
        USART_SendData8(EVAL_COM1, (tmp[3-i]+0x30));
      
        USART_SendData8(EVAL_COM1, '\n');
       

}

使用特权

评论回复
8
caipeifeng|  楼主 | 2012-7-2 21:43 | 只看该作者
还有相关的中断:
INTERRUPT_HANDLER(ADC1_COMP_IRQHandler, 18)
{
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */
  /* Get ADC convertion value */
  ADCdata = ADC_GetConversionValue(ADC1);
}
INTERRUPT_HANDLER(USART1_TX_TIM5_UPD_OVF_TRG_BRK_IRQHandler, 27)
{
  #ifdef USE_STM8L1526_EVAL
   /* Write one byte to the transmit data register */
   USART_SendData8(EVAL_COM1, TxBuffer[TxCounter++]);
   USART_ClearITPendingBit(EVAL_COM1, USART_IT_TC);

   if (TxCounter == TX_BUFFER_SIZE)
   {
     /* Disable the USART Transmit Complete interrupt */
     USART_ITConfig(EVAL_COM1, USART_IT_TC, DISABLE);
   }
#endif /* USE_STM8L1526_EVAL */



}

使用特权

评论回复
9
caipeifeng|  楼主 | 2012-7-2 21:45 | 只看该作者
求高手帮忙解决一下,万分感谢!

使用特权

评论回复
10
figo20042005| | 2012-7-2 21:54 | 只看该作者
这程序太长了,没人看的,还是一段一段去调试吧

使用特权

评论回复
11
IJK| | 2012-7-3 09:51 | 只看该作者
这程序太长了,没人看的,还是一段一段去调试吧
figo20042005 发表于 2012-7-2 21:54


赞同。
多说一句,自己多调试,长进比较快。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

12

帖子

0

粉丝