打印

stc8A8k64D4的adc+dma 奇怪问题

[复制链接]
1326|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
AD, DM, ST, dc, stc8a
本帖最后由 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[ADC_CH][ADC_DATA] ;

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[7][66];
                        tempvalue1 = (tempvalue1 <<8 )+ BmmAdBuffer[7][67];
                        tempvalue2 = BmmAdBuffer[8][66];
                        tempvalue2 = (tempvalue2 <<8 )+ BmmAdBuffer[8][67];
                        tempvalue3 = BmmAdBuffer[0][66];
                        tempvalue3 = (tempvalue3 <<8 )+ BmmAdBuffer[0][67];
                        tempvalue4 = BmmAdBuffer[1][66];
                        tempvalue4 = (tempvalue4 <<8 )+ BmmAdBuffer[1][67];
                        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 ,就会安排销售支持你,销售会给你拉专业技术支持组个技术群,就搞定了。

测试截图.png (53.58 KB )

测试截图.png

02-9路12位ADC转换-DMA-串口1(P3.1)返回结果-C语言.rar

56.72 KB

使用特权

评论回复
评论
咖啡色牛奶 2022-6-15 17:19 回复TA
@flame123 :这个混乱,,就本来串口接收的数据是 0x31、0x32。。。这类的 就是 123.。。的ASCII码。结果如果串口一次性发送了257个字节的数据后 MCU发出来就不是这些了,,如果说是覆盖的话,难道又错开了几位,导致数据变成乱码。好像这个评论里面没法发送图片,下面回复帖子中可以。我再把测试的图片发上来,您看看。 
flame123 2022-6-12 21:15 回复TA
@咖啡色牛奶 :设立一个缓存区来存储DMA过来的数据。,你的这个不是内存混乱,是后进的数据把前面的覆盖了 
咖啡色牛奶 2022-6-11 09:21 回复TA
您好 ,贵公司STC8A单片机 串口DMA 若一次性接收超过256个字节,会导致内存区混乱,有什么解决方法么?使用的是贵公司DMA Dome Uart的代码。 
板凳
咖啡色牛奶| | 2022-6-15 17:36 | 只看该作者
这个是测试数据。@flame123

微信图片编辑_20220615173443.jpg (416.25 KB )

微信图片编辑_20220615173443.jpg

使用特权

评论回复
地板
flame123| | 2022-6-15 18:12 | 只看该作者
咖啡色牛奶 发表于 2022-6-15 17:36
这个是测试数据。@flame123

是的,这个芯片我没用过,估计DMA最大一次能搬运的就是256个字节,你发多了,估计指针飞了或者溢出了,所以显示接收的是乱码,你可以尝试,把数据加个缓存,收256个就搬走,然后重新开始收。

使用特权

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

本版积分规则

163

主题

365

帖子

3

粉丝