taijing33 发表于 2022-6-9 15:49

stc8A8k64D4的adc+dma 奇怪问题

本帖最后由 taijing33 于 2022-6-9 15:53 编辑

我按照厂家提供的例子,自己改的程序。使用了9路adc口,
P1_MODE_IN_HIZ( GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5| GPIO_Pin_6);
P0_MODE_IN_HIZ( GPIO_Pin_5 | GPIO_Pin_6);                //P0.0~P0.6 ÉèÖÃΪ¸ß×èÊäÈë

然后adc功能和dma初始化 如下
#define      ADC_CH                9                        /* 1~16, ADC转换通道数, 需同步修改转换通道 */
#define      ADC_DATA      68                        /* 6~n, 每个通道ADC转换数据总数, 2*转换次数+4, 需同步修改转换次数 */
#define      BMM_ADDR      0x800                /* BMMÊý¾Ý´æ·ÅµØÖ· */

/*************      ±¾µØ±äÁ¿ÉùÃ÷      **************/

bit      BmmFlag;

u8 xdata BmmAdBuffer ;

void BMM_AD_init(void)
{
      
      ADC_InitTypeDef                ADC_InitStructure;                //????

      BMM_ADC_InitTypeDef                BMM_ADC_InitStructure;                //????
      //----------------------------------------------
      
      P1_MODE_IN_HIZ( GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5| GPIO_Pin_6);
       P0_MODE_IN_HIZ( GPIO_Pin_5 | GPIO_Pin_6);                //P0.0~P0.6 ÉèÖÃΪ¸ß×èÊäÈë

      //----------------------------------------------
      ADC_InitStructure.ADC_SMPduty   = 31;                //ADC 模拟信号采样时间控制, 0~31(注意: SMPDUTY 一定不能设置小于 10)
      ADC_InitStructure.ADC_CsSetup   = 0;                //ADC 通道选择时间控制 0(默认),1
      ADC_InitStructure.ADC_CsHold    = 1;                //ADC 通道选择保持时间控制 0,1(默认),2,3
      ADC_InitStructure.ADC_Speed   = ADC_SPEED_2X1T;                //设置 ADC 工作时钟频率      ADC_SPEED_2X1T~ADC_SPEED_2X16T
      ADC_InitStructure.ADC_AdjResult = ADC_RIGHT_JUSTIFIED;      //ADC结果调整,      ADC_LEFT_JUSTIFIED,ADC_RIGHT_JUSTIFIED
      ADC_Inilize(&ADC_InitStructure);                //初始化
      ADC_PowerControl(ENABLE);                                                //ADC电源开关, ENABLE或DISABLE
      NVIC_ADC_Init(DISABLE,Priority_0);                //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3

      //----------------------------------------------
      BMM_ADC_InitStructure.BMM_Enable = ENABLE;                        //BMM使能          ENABLE,DISABLE
      BMM_ADC_InitStructure.BMM_Channel = 0x607f;                        //ADC通道使能寄存器, 1:使能, bit15~bit0 对应 ADC15~ADC0;0x607f一共使能了9个adc通道
      BMM_ADC_InitStructure.BMM_Buffer = BmmAdBuffer;      //ADC转换数据存储地址
      BMM_ADC_InitStructure.BMM_Times = ADC_32_Times;      //每个通道转换次数,      ADC_1_Times,ADC_2_Times,ADC_4_Times,ADC_8_Times,ADC_16_Times,ADC_32_Times,ADC_64_Times,ADC_128_Times,ADC_256_Times
      BMM_ADC_Inilize(&BMM_ADC_InitStructure);                //初始化
      NVIC_BMM_ADC_Init(ENABLE,Priority_0,Priority_0);                //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0~Priority_3; 总线优先级(低到高) Priority_0~Priority_3
      BMM_ADC_TRIG();                //触发启动转换

}




取值操作方法如下
if(BmmFlag == 1)
                {
                        BmmFlag = 0;RUN_LED = !RUN_LED;
                        tempvalue1 = BmmAdBuffer;
                        tempvalue1 = (tempvalue1 <<8 )+ BmmAdBuffer;
                        tempvalue2 = BmmAdBuffer;
                        tempvalue2 = (tempvalue2 <<8 )+ BmmAdBuffer;
                        tempvalue3 = BmmAdBuffer;
                        tempvalue3 = (tempvalue3 <<8 )+ BmmAdBuffer;
                        tempvalue4 = BmmAdBuffer;
                        tempvalue4 = (tempvalue4 <<8 )+ BmmAdBuffer;
                        BMM_ADC_TRIG();
                }
其中tempvalue1 tempvalue2 tempvalue3 tempvalue4 是外部4路ntc测温的adc值。
现在只有tempvalue3 tempvalue4是正确的,tempvalue1 tempvalue2严重不对,而且在外部ntc未接的情况下,整个io悬空的情况下
ADC13和adc14 IO口有1V左右的电压。
ADC13和adc14 对应的io口是p0.5和p0.6。
我不用dma功能的话,这2个io口的adc功能是正常的。,



yunie0608 发表于 2022-6-10 09:02


用户请先别修改程序, 直接下载"02-9路12位ADC转换-DMA-串口1(P3.1)返回结果-C语言"里的"ADC.hex"测试.

下载时选择主频11.0592MHZ. 测试时, 电脑的串口助手设置115200,8,n,1.


   测试截图: 其中通道5、6未加电压。因为我的分压电阻电压是1/8~7/8,一次接7个输入端测试。

      后期技术问题直接电: 0513-55012928 ,就会安排销售支持你,销售会给你拉专业技术支持组个技术群,就搞定了。

咖啡色牛奶 发表于 2022-6-15 17:36

这个是测试数据。@flame123

flame123 发表于 2022-6-15 18:12

咖啡色牛奶 发表于 2022-6-15 17:36
这个是测试数据。@flame123

是的,这个芯片我没用过,估计DMA最大一次能搬运的就是256个字节,你发多了,估计指针飞了或者溢出了,所以显示接收的是乱码,你可以尝试,把数据加个缓存,收256个就搬走,然后重新开始收。
页: [1]
查看完整版本: stc8A8k64D4的adc+dma 奇怪问题